一、问题现象
在部分perso定制中需要Setupwizard启动过程中全程竖屏,默认屏幕旋转开启(adb shell settings get system accelerometer_rotation获取到的值为1),导致在Setupwizard启动过程中会随方向旋转。
二、解决方案
针对启动过程中的window做强制竖屏处理
三、具体分析流程
在各个界面使用命令:adb shell dumpsys window,查看结果中WINDOW MANAGER ANIMATOR STATE,得知对应的window
WINDOW MANAGER ANIMATOR STATE (dumpsys window animator)
DisplayContentsAnimator #0:
Window #0: WindowStateAnimator{312e2aa3 com.android.systemui.ImageWallpaper}
Window #1: WindowStateAnimator{1eb801a0 com.google.android.setupwizard/com.google.android.setupwizard.user.WelcomeActivity}
Window #2: WindowStateAnimator{1bdcb07a com.google.android.setupwizard/com.google.android.setupwizard.carrier.SimMissingActivity}
Window #3: WindowStateAnimator{1571bbe1 com.android.settings/com.android.settings.wifi.WifiSetupActivity}
Window #4: WindowStateAnimator{2cf45163 com.android.settings/com.android.settings.wifi.WifiSetupActivity}
Window #5: WindowStateAnimator{697a159 KeyguardScrim}
Window #6: WindowStateAnimator{258f011e StatusBar}
mBulkUpdateParams=0x8 ORIENTATION_CHANGE_COMPLETE
四、解决方案代码
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
while (pos >= 0) {
WindowState win = windows.get(pos);
pos--;
if (win.mAppToken != null) {
// We hit an application window. so the orientation will be determined by the
// app window. No point in continuing further.
//20160203 for PR-1135644 begin
if((win+"").contains("com.google.android.setupwizard")){
return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
if((win+"").contains("com.android.settings.wifi.WifiSetupActivity")){
return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
//20160203 for PR-1135644 end
return (mLastWindowForcedOrientation=ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
if (!win.isVisibleLw() || !win.mPolicyVisibilityAfterAnim) {
continue;
}
int req = win.mAttrs.screenOrientation;
if((req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) ||
(req == ActivityInfo.SCREEN_ORIENTATION_BEHIND)){
continue;
}
if (DEBUG_ORIENTATION) Slog.v(TAG, win + " forcing orientation to " + req);
return (mLastWindowForcedOrientation=req);
}