android 12/13 分屏设置Task的Bounds区域-系统车机开发必学

Posted learnframework

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 12/13 分屏设置Task的Bounds区域-系统车机开发必学相关的知识,希望对你有一定的参考价值。

hi,近来研究分屏时候发现android 13上的分屏和以前的分屏代码差别比较大
主要区别在于把原来大部分分屏相关业务在systemserver进行的都放入到了systemui进程,对应的代码基本都在:
frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/
这里面进行对应分屏相关的一个业务处理, 比如分割线拖拽对两个分屏大小影响等。最后都会通过包装成WindowContainerTransaction对象,再通过WindowOrganizerController的本地代理,跨进程传递到systemserver的WindowOrganizerController类中进行处理.

大概流程很复杂,这里我这记录一下一个难以表面看出的点,那就是怎么对Task的相关的Bounds进行设置的,这个在以前android版本就直接systemserver的Task或之ActivityStack调用resize就行,但新版本就没有这么容易看出,最后经过打印相关堆栈的调试发现应该设置是如下流程:

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_01046251526 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就是

  @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;
    

最后就是调用的windowConfiguration.getBounds

以上是关于android 12/13 分屏设置Task的Bounds区域-系统车机开发必学的主要内容,如果未能解决你的问题,请参考以下文章

Android 7.0的系统变化

禁用 Android 中所有应用的分屏模式

Android 7.0 分屏拖拽文字和图片的研究

Android 7.0 分屏拖拽文字和图片的研究

Android N分屏模式Activity生命周期的变化

Xamarin Android - Task.Run vs Task.Factory.StartNew和Thread.CurrentPrincipal