[RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
Settings -> Display有个选项控制旋转屏幕时内容是否跟着旋转
这个功能是通过获取gsensor的方向来改变内容进行旋转的,选项对应的string在
packages/apps/Settings/res/values/strings.xml:6408: <string name="display_auto_rotate_title">When device is rotated</string>
对应的key在Display_settings.xml
<com.android.settings.DropDownPreference
android:key="auto_rotate"
android:title="@string/display_auto_rotate_title" />
android:key=”auto_rotate”的使用:
DisplaySettings.java
private static final String KEY_AUTO_ROTATE = "auto_rotate";
DropDownPreference rotatePreference = (DropDownPreference) findPreference(KEY_AUTO_ROTATE);
rotatePreference.setCallback(new Callback()
{@Overridepublic boolean onItemSelected(int pos, Object value) {final boolean locked = (Boolean) value;MetricsLogger.action(getActivity(), MetricsLogger.ACTION_ROTATION_LOCK,locked);RotationPolicy.setRotationLock(activity, locked);return true;}
}
当被开机自动旋转时,有如下调用
onItemSelected ->
RotationPolicy.setRotationLock ->
setRotationLock -> RotationPolicy.java
wm.freezeRotation -> //wm是WindowManagerService
freezeRotation -> WindowManagerService.java
mPolicy.setUserRotationMode(WindowManagerPolicy.USER_ROTATION_LOCKED…)//更新到database中
setUserRotationMode -> PhoneWindowManager.java //更新Settings.System.USER_ROTATION以及Settings.System.ACCELEROMETER_ROTATION,另一方面Settings.System.USER_ROTATION这个值在开机的时候被SettingsObserver的observe()注册监听,一旦有更新,就会调用对应的onChange()
onChange ->
updateSettings ->
updateOrientationListenerLp ->
mOrientationListener.enable -> //集成自WindowOrientationListener,调用父类的enable()
enable -> WindowOrientationListener.java
mOrientationJudge.resetLocked //对应的是OrientationSensorJudge
mSensorManager.registerListener //把OrientationSensorJudge注册到SensorManager中
updateRotationUnchecked
updateRotationUnchecked在 [RK3288][Android6.0] Apk设置显示旋转过程小结 已经分析过了。
当屏幕发生旋转后,sensor模块上报数据给SensorManager,SensorManager会调用OrientationSensorJudge类的onSensorChanged()
public void onSensorChanged(SensorEvent event) {int newRotation;synchronized (mLock) {mDesiredRotation = (int) event.values[0];//获取新的rotationnewRotation = evaluateRotationChangeLocked();}if (newRotation >=0) {//调用抽象方法onProposedRotationChanged(newRotation);}
}
PhoneWindowManager.java
public void onProposedRotationChanged(int rotation) {if (localLOGV) Slog.v(TAG, "onProposedRotationChanged, rotation=" + rotation);mHandler.post(mUpdateRotationRunnable);
}
mUpdateRotationRunnable对应的是下面的
private final Runnable mUpdateRotationRunnable = new Runnable() {@Overridepublic void run() {// send interaction hint to improve redraw performancemPowerManagerInternal.powerHint(PowerManagerInternal.POWER_HINT_INTERACTION, 0);updateRotation(false);}
};
PhoneWindowManager.java
void updateRotation(boolean alwaysSendConfiguration) {try {//set orientation on WindowManagermWindowManager.updateRotation(alwaysSendConfiguration, false);} catch (RemoteException e) {// Ignore}
}
mWindowManager就是WindowManagerService
public void updateRotation(boolean alwaysSendConfiguration, boolean forceRelayout) {
updateRotationUnchecked(alwaysSendConfiguration, forceRelayout);
}
最终也是调用updateRotationUnchecked()来更新
参考:
android自动转屏流程分析
[RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结相关推荐
- [RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100%
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 之前文章[RK3288][Android6.0] 调试笔记 - 伪电池驱动添加 阐述了如何添加一个 ...
- [RK3288][Android6.0] Skia中的编解码小结
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 编解码器注册: SKIA的编解码部分通过一个模板类来实现,这样做的为了实现不同类型的codec兼容 ...
- 声道切换 android,[RK3288][Android6.0] Audio中的单声道到双声道的转换处理过程
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 播放音乐是单声道,硬件用的是双声道. AudioFlinger::PlaybackThread:: ...
- [RK3288][Android6.0] Audio中的单声道到双声道的转换处理过程
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 播放音乐是单声道,硬件用的是双声道. AudioFlinger::PlaybackThread:: ...
- android6.0开发者模式,[RK3288][Android6.0] 调试笔记 --- user版本默认显示开发者选项...
Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 默认user版本不显示开发者选项这一栏,需要通过连续点击版本号7次来显示. packages\ap ...
- Android系统(127)---Android6.0存储中加入总内存和系统内存项和在西语下把,换成.
Android6.0存储中加入总内存和系统内存项 阅读数:651 平台下patches/packages/apps/Settings/里面 1.存储中加入总内存和系统内存项 在 res/values- ...
- [RK3288][Android6.0] 调试笔记 --- WiFi芯片AP6356S添加
Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背景: RK3288 Android6.0平台对AP6356S的支持不是很完善,直接修改wifi ch ...
- [RK3288][Android6.0] 调试笔记 --- touch无法获取坐标点
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 有网友遇到调试touch的时候能触发中断,但无法获取坐标点 具体可参考文章 [RK3288][An ...
- [RK3288][Android6.0] 调试笔记 --- AndroidTool低格无效问题
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 现象: 之前文章 [RK3288][Android6.0] 调试笔记 - AndroidTool两 ...
最新文章
- China SAFe DAY 2020中国规模化敏捷大会圆满落幕
- 活久见!北大博士干了半年外卖骑手,写出 AI 伦理论文登上顶刊,“系统知道一切”...
- ​rsync应用拓展多模块同步13
- 10-20国际电极标准系统
- SDL及扩展库在ARM-Linux 完整移植
- fcn网络训练代码_用FCN做分割
- python输入流和输出流_python读写gbk、utf-8等输入输出流
- python getattr_Python 内置方法和属性应用:反射和单例
- codevs4343 找回密码
- 支付宝ios SDK官方下载页面
- laravel leftjoin 右侧取最新一条_高铁规划:湖南至广西将增添一条高铁,填补中西部地区铁路网空白...
- mysql 中用select建表_用 SELECT 的结果创建表
- 小米浏览器 解析html5,JavaScript - 判断当前用户使用的浏览器
- bootstrap-modal 模态框显示一下又消失问题解决以及模态框的基本使用方法
- TypeError: __init__() got an unexpected keyword argument ‘rate‘
- 微信开放平台 安卓Android 应用签名生成
- Excel表格垂直居中后还是不在单元格中间(探究原因贴)
- Bootstrap下拉菜单
- jaccard相似性度量
- 深富策略短线消化市场情绪