Android 9.0 USER_ROTATION重启恢复问题分析
摘要:
最近MTK平台 9.0系统中,遇到System签名APK 使用方法“System.putInt(contentResolver, “user_rotation”, rotation);” 调整屏幕方向时,重启后方向总恢复默认方向的问题。
问题原因:
MtkSystemUI 的一个 NavigationBarFragment初始化时,重新设置了user_rotation
调整方向:
protected void setScreenRotation(int rotation) {
ContentResolver contentResolver = this.mActivity.getContentResolver();
try {
if (System.getInt(contentResolver, "accelerometer_rotation", 0) != 0) {
System.putInt(contentResolver, "accelerometer_rotation", 0);
}
} catch (Exception e) {
}
try {
if (rotation != System.getInt(contentResolver, "user_rotation", 0)) {
System.putInt(contentResolver, "user_rotation", rotation);
}
} catch (Exception e2) {
}
}
简陋的思维导图
花时间找到一个修改的方案:
以下是个人最近使用Xmind制作的一个 9.0系统 每次重启user_rotation的值都会重置,问题分析应该重下往上逐步找到问题出现的起始点。
流程图:
思维导图说明
以下内容是使用xmind 导出思维导图的 md文件,再导入CSDN自动生成
SystemUI
位置:frameworks/base/packages/SystemUI/
NavigationBarFragment.java
onCreate()初始化
NavigationBarFragment 中通过调用 RotationLockController 的函数
setRotationLockedAtAngle 传入参数
- onCreate
** 接口类:RotationLockController.java**
- setRotationLockedAtAngle
RotationLockControllerImpl.java
实现RotationLockController接口
实现 setRotationLockedAtAngle
- setRotationLockedAtAngle
RotationPolicy
位置:frameworks/base/core/java/com/android/internal/view/RotationPolicy.java
-
setRotationLockAtAngle
-
setRotationLock
此函数通过AsyncTask 调用 WMS 的函数freezeRotation 固定屏幕方向
windowManagerService
位置:
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
- freezeRotation
固定屏幕旋转
PhoneWindowManager
- setUserRotationMode
这个函数的主要作用,是把 rotation重新 put到 SettingsProvider中,这时所有的ContentObserver