1. Multi-Window Mode
如何进入分屏模式?
长按Overview,App进入Split Screen Mode
单击Overview,点击App标题栏上的吕形按钮,进入Split Screen Mode
单击Overview,长按App标题栏拖入屏幕上的高亮区域,然后进入Freeform Screen Mode
如何配置App支持分屏模式?
项目首先需要满足的
targetSdkVersion >= Android N Preview
项目AndroidManifest.xml中需要给MainActivity配置:
android:resizeableActivity = true
这个属性值在Android N的手机系统默认true,也就是默认支持分屏,前提是满足条件1。
名词:
Full Screen Mode:全屏幕模式
Split Screen Mode: 上下屏幕模式
Freeform Screen Mode: 自由尺寸屏幕模式
2. 分屏模式下被禁用的特性
- 分屏模式下无法隐藏系统的状态栏
- 分屏模式下无法根据屏幕方向旋转App
3. 分屏模式下Activity的生命周期和回调方法
正常情况下,切换分屏模式的生命周期
长按overview进入分屏模式的Activity生命周期
MainActivity: onMultiWindowModeChanged
MainActivity: isInMultiWindowMode:true
MainActivity: onPause
MainActivity: onSaveInstanceState
MainActivity: onStop
MainActivity: onDestory
MainActivity: onCreate
MainActivity: onStart
MainActivity: onRestoreInstanceState
MainActivity: onResume
//注意这里,这里是因为切换到Split Mode的时候,Activity会先立即失去焦点,这点很关键
MainActivity: onPause退出分屏模式
退出分屏模式时,基于分屏模式下Activity的状态,不同的状态生命周期回调有差异
如果Activity处于 onPause状态,退出分配模式:
MainActivity: onSaveInstanceState
MainActivity: onStop
MainActivity: onDestory
MainActivity: onCreate
MainActivity: onStart
MainActivity: onRestoreInstanceSate
MainActivity: onResume
MainActivity: onPause
MainActivity: onMultiWindowModeChanged
MainActivity: isInMultiWindowMode:false
MainActivity: onResume
//这个Log不属于退出分屏流程的回调如果Activity处于onResume状态,退出分屏模式:
MainActivity: onPause
MainActivity: onSaveInstanceState
MainActivity: onStop
MainActivity: onDestroy
MainActivity: onCreate
MainActivity: onStart
MainActivity: onRestoreInstanceState
MainActivity: onResume
MainActivity: D/MN: onMultiWindowModeChanged
MainActivity: isInMultiWindowMode= false上面的Log输出说明了,如果退出分屏模式之前为onPause状态,则退出之后Activty也必须切换到onPause状态,然后调用的onResume不属于退出分屏的回调流程,属于Activity展示在前台进程获取焦点时的回调。反之,如果退出之前是onResume状态,则退出之后也必须是onResume,则不必再onResume
总结就是:分屏模式下做一些操作,譬如退出分屏/改变分屏模式的尺寸,Activty在操作前的状态和操作后的状态要保持一致。至于Activity被放置到前台进程时触发的Activty生命周期回调方法,不属于分屏模式下操作的回调。
分屏模式下,从一个Activity切换到和它同处于多窗口的另外一个Activity
MainActivity: onPause
SecondActivity: onResume
分屏模式下,改变窗口的尺寸,也需要判断Activty的上一个状态 onPause/onResume
操作之前处于onPause状态:
MainActivity:D/MN: onSaveInstanceState
MainActivity:onStop
MainActivity:onDestroy
MainActivity:onCreate
MainActivity:onStart
MainActivity:onRestoreInstanceState
MainActivity:onResume
MainActivity:onPause操作之前处于onResume状态:
MainActivity:onPause
MainActivity:onSaveInstanceState
MainActivity:onStop
MainActivity:onDestroy
MainActivity: onCreate
MainActivity:onStart
MainActivity:onRestoreInstanceState
MainActivity:onResume
由上面的情况可以得知,当切换到多窗口模式或者改变多窗口模式下Activity 的尺寸时,Activity会被销毁然后重新加载。
特殊情况下,切换分屏模式的生命周期
为了解决上述的Activity销毁重建的问题,特做了一下配置:
在AndroidManifest.xml文件中,给Activity加上属性配置如下:
android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"
- 在Activity中复写方法
onConfigurationChanged
(不是必须,根据自身的情况来判断是否需要复写)
- 在Activity中复写方法
在这种情况下由Full ScreenMode切换为Split Screen Mode,其生命周期:
MainActivity:onPause
MainActivity:onSaveInstanceState
MainActivity:onStop
MainActivity:onConfigurationChanged
MainActivity:onMultiWindowModeChanged
MainActivity:isInMultiWindowMode= true
MainActivity:onRestart
MainActivity:onStart
MainActivity:onResume <