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旋转显示画面小结相关推荐

  1. [RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100%

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 之前文章[RK3288][Android6.0] 调试笔记 - 伪电池驱动添加 阐述了如何添加一个 ...

  2. [RK3288][Android6.0] Skia中的编解码小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 编解码器注册: SKIA的编解码部分通过一个模板类来实现,这样做的为了实现不同类型的codec兼容 ...

  3. 声道切换 android,[RK3288][Android6.0] Audio中的单声道到双声道的转换处理过程

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 播放音乐是单声道,硬件用的是双声道. AudioFlinger::PlaybackThread:: ...

  4. [RK3288][Android6.0] Audio中的单声道到双声道的转换处理过程

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 播放音乐是单声道,硬件用的是双声道. AudioFlinger::PlaybackThread:: ...

  5. android6.0开发者模式,[RK3288][Android6.0] 调试笔记 --- user版本默认显示开发者选项...

    Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 默认user版本不显示开发者选项这一栏,需要通过连续点击版本号7次来显示. packages\ap ...

  6. Android系统(127)---Android6.0存储中加入总内存和系统内存项和在西语下把,换成.

    Android6.0存储中加入总内存和系统内存项 阅读数:651 平台下patches/packages/apps/Settings/里面 1.存储中加入总内存和系统内存项 在 res/values- ...

  7. [RK3288][Android6.0] 调试笔记 --- WiFi芯片AP6356S添加

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背景: RK3288 Android6.0平台对AP6356S的支持不是很完善,直接修改wifi ch ...

  8. [RK3288][Android6.0] 调试笔记 --- touch无法获取坐标点

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 有网友遇到调试touch的时候能触发中断,但无法获取坐标点 具体可参考文章 [RK3288][An ...

  9. [RK3288][Android6.0] 调试笔记 --- AndroidTool低格无效问题

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 现象: 之前文章 [RK3288][Android6.0] 调试笔记 - AndroidTool两 ...

最新文章

  1. China SAFe DAY 2020中国规模化敏捷大会圆满落幕
  2. 活久见!北大博士干了半年外卖骑手,写出 AI 伦理论文登上顶刊,“系统知道一切”...
  3. ​rsync应用拓展多模块同步13
  4. 10-20国际电极标准系统
  5. SDL及扩展库在ARM-Linux 完整移植
  6. fcn网络训练代码_用FCN做分割
  7. python输入流和输出流_python读写gbk、utf-8等输入输出流
  8. python getattr_Python 内置方法和属性应用:反射和单例
  9. codevs4343 找回密码
  10. 支付宝ios SDK官方下载页面
  11. laravel leftjoin 右侧取最新一条_高铁规划:湖南至广西将增添一条高铁,填补中西部地区铁路网空白...
  12. mysql 中用select建表_用 SELECT 的结果创建表
  13. 小米浏览器 解析html5,JavaScript - 判断当前用户使用的浏览器
  14. bootstrap-modal 模态框显示一下又消失问题解决以及模态框的基本使用方法
  15. TypeError: __init__() got an unexpected keyword argument ‘rate‘
  16. 微信开放平台 安卓Android 应用签名生成
  17. Excel表格垂直居中后还是不在单元格中间(探究原因贴)
  18. Bootstrap下拉菜单
  19. jaccard相似性度量
  20. 深富策略短线消化市场情绪

热门文章

  1. vcode(visual studio code)中文配置
  2. fi sap 凭证冲销 稅_SAP中各种记账凭证的冲销
  3. 云计算的基本概念(转载)
  4. ESP8266-Arduino编程实例-TEA5767收音机模块驱动
  5. php面向对象笔试题,php练习笔试题
  6. 电机震动噪声(NVH)入门笔记
  7. 入门VR游戏开发者在Unreal Engine 4上开始VR设计所需要知道的
  8. 数学定理百科——黑洞数
  9. 系统用github的方式登陆
  10. SpringSecurity安全框架学习心得,避免踩坑。