问题:Google强制竖屏的应用横屏状态下进入最近任务,taskview显示异常
步骤:
- 打开屏幕自动旋转
- 打开一个设置了强制竖屏的应用
- 将手机旋转成横向
- 调出最近任务页面,查看当前应用在最近任务的显示
这个问题主要是recent是横屏,所以会触发configuration change, 导致talkinggingerfree的bound变成(0, 0 - 2280, 1080),而做shapshot的时候,又用的是这个bounds,所以导致出错:
Line 753: 05-09 17:37:42.679012 1042 1062 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.outfit7.talkinggingerfree/com.outfit7.talkingginger.Main bnds=[640,1396][839,1718]} from uid 10093
Line 6057: 05-09 17:37:47.188711 1042 2382 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher3/.Launcher (has extras)} from uid 10093
Line 13298: 05-09 17:37:47.469346 1042 2382 W WindowManager: onConfigurationChanged,this:{taskId=8 appTokens=[AppWindowToken{8f0f3c token=Token{18eb10d ActivityRecord{978875b u0 com.outfit7.talkinggingerfree/com.outfit7.talkingginger.Main t8}}}] mdr=false},hasWindowsAlive():true,newParentConfig:{1.0 ?mcc?mnc [en_US] ldltr sw360dp w684dp h332dp 480dpi nrml long land finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 2280, 1080) mAppBounds=Rect(84, 0 - 2136, 1080) mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_90} s.132}
Line 13299: 05-09 17:37:47.469656 1042 2382 W WindowManager: onConfigurationChanged getBounds():Rect(0, 0 - 2280, 1080)
Line 14263: 05-09 17:37:47.486717 1042 2382 W WindowManager: [mtk]createTaskSnapshot: {taskId=8 appTokens=[AppWindowToken{8f0f3c token=Token{18eb10d ActivityRecord{978875b u0 com.outfit7.talkinggingerfree/com.outfit7.talkingginger.Main t8}}}] mdr=false},buffer.getWidth(): 2280,buffer.getHeight(): 1080,mTmpRet:Rect(0, 0 - 2280, 1080)
如果是按home key退出,再接recent进入,因为不会有竖屏到横屏的切换,所以shapshot的时候,下的是竖屏的rect: (0, 0 - 1080, 2280),这样是没有问题的:
Line 29447: 05-09 17:37:17.305332 1042 1748 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.outfit7.talkinggingerfree/com.outfit7.talkingginger.Main bnds=[640,1396][839,1718]} from uid 10093
Line 45059: 05-09 17:37:34.355339 1042 1064 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.launcher3/.Launcher (has extras)} from uid 0
Line 47169: 05-09 17:37:34.430870 1042 1067 W WindowManager: [mtk]createTaskSnapshot: {taskId=8 appTokens=[AppWindowToken{8f0f3c token=Token{18eb10d ActivityRecord{978875b u0 com.outfit7.talkinggingerfree/com.outfit7.talkingginger.Main t8}}}] mdr=false},buffer.getWidth(): 1080,buffer.getHeight(): 2280,mTmpRet:Rect(0, 0 - 1080, 2280)
解决:
在alps/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
if (mWindowManager != null) {
mWindowManager.deferSurfaceLayout();
}
try {
if (values != null) {
// ++++++++++++ start
kept = ensureConfigAndVisibilityAfterUpdate(starting, changes);
// ++++++++++++ end
if (displayId == DEFAULT_DISPLAY) {
// Override configuration of the default display duplicates global config, so
// we're calling global config update instead for default display. It will also
// apply the correct override config.
changes = updateGlobalConfigurationLocked(values, false /* initLocale */,
false /* persistent */, UserHandle.USER_NULL /* userId */, deferResume);
} else {
changes = performDisplayOverrideConfigUpdate(values, deferResume, displayId);
}
}