android 12/13 分屏設置Task的Bounds區(qū)
hi,近來研究分屏時候發(fā)現(xiàn)android 13上的分屏和以前的分屏代碼差別比較大 主要區(qū)別在于把原來大部分分屏相關業(yè)務在systemserver進行的都放入到了systemui進程,對應的代碼基本都在: frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ 這里面進行對應分屏相關的一個業(yè)務處理, 比如分割線拖拽對兩個分屏大小影響等。最后都會通過包裝成WindowContainerTransaction對象,再通過WindowOrganizerController的本地代理,跨進程傳遞到systemserver的WindowOrganizerController類中進行處理. 大概流程很復雜,這里我這記錄一下一個難以表面看出的點,那就是怎么對Task的相關的Bounds進行設置的,這個在以前android版本就直接systemserver的Task或之ActivityStack調(diào)用resize就行,但新版本就沒有這么容易看出,最后經(jīng)過打印相關堆棧的調(diào)試發(fā)現(xiàn)應該設置是如下流程: ```cpp 02-13 22:27:30.861??560??890 I test??: setBounds change = { mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0}1046251526 rect Rect(0, 0 - 1440, 810) 02-13 22:27:30.861??560??890 I test??: java.lang.Exception 02-13 22:27:30.861??560??890 I test??: at android.app.WindowConfiguration.setBounds(WindowConfiguration.java:294) 02-13 22:27:30.861??560??890 I test??: at android.app.WindowConfiguration.updateFrom(WindowConfiguration.java:494) 02-13 22:27:30.861??560??890 I test??: at android.content.res.Configuration.updateFrom(Configuration.java:1706) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.ConfigurationContainer.onConfigurationChanged(ConfigurationContainer.java:133) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.WindowContainer.onConfigurationChanged(WindowContainer.java:510) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.TaskFragment.onConfigurationChanged(TaskFragment.java:2260) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.Task.onConfigurationChangedInner(Task.java:1903) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.Task.onConfigurationChanged(Task.java:1976) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.ConfigurationContainer.onRequestedOverrideConfigurationChanged(ConfigurationContainer.java:200) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.WindowContainer.onRequestedOverrideConfigurationChanged(WindowContainer.java:973) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.WindowOrganizerController.applyChanges(WindowOrganizerController.java:534) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.WindowOrganizerController.applyWindowContainerChange(WindowOrganizerController.java:1217) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.WindowOrganizerController.applyTransaction(WindowOrganizerController.java:427) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.WindowOrganizerController.applyTransaction(WindowOrganizerController.java:372) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.WindowOrganizerController.applySyncTransaction(WindowOrganizerController.java:218) 02-13 22:27:30.861??560??890 I test??: at android.window.IWindowOrganizerController$Stub.onTransact(IWindowOrganizerController.java:215) 02-13 22:27:30.861??560??890 I test??: at com.android.server.wm.WindowOrganizerController.onTransact(WindowOrganizerController.java:163) 02-13 22:27:30.861??560??890 I test??: at android.os.Binder.execTransactInternal(Binder.java:1285) 02-13 22:27:30.861??560??890 I test??: at android.os.Binder.execTransact(Binder.java:1244) ``` 其實Task的Bounds就是 ```cpp ?@Override ??public void getBounds(Rect bounds) { ????bounds.set(getBounds()); ??} ????/** ???* Returns the effective bounds of this container, inheriting the first non-empty bounds set in ???* its ancestral hierarchy, including itself. ???*/ ??public Rect getBounds() { ????mReturnBounds.set(getConfiguration().windowConfiguration.getBounds()); ????return mReturnBounds; ??} ``` 最后就是調(diào)用的windowConfiguration.getBounds