前言
在智能手机更新换代越来越快,手机屏幕越来越大,手机可以做的事情越来越多,人们已经离不开智能手机了,甚至有的人开始在用手机办公了。在大屏幕手机上,如果一个手机可以一边播放视频,一边上着网,那种体验是非常爽的。终于,在Android 7.0(N)(API 24)引入了多窗口(Android N 的 Nexus Player还有画中画)的支持,也就是分屏显示,可以是上下排列,也可以是左右排列,可以在播放视频的同时上网,购物等等。在以前的Android原生系统中是没有这项功能的,以前的系统版本中有的手机支持多窗口模式,这也是由开发商自己在Android原生系统的基础上进行了定制。
1. 启动多窗口模式
在以前编写的应用程序默认是支持多窗口模式的,所以,启动多窗口模式不需要做特别的操作,只需在Android N版本的手机上通过以下两种方式来启动多窗口模式(注意姿势))
- 打开任意应用,长按overview(菜单)按钮即可使得当前应用进入多窗口模式(自由形状模式);
- 在overview列表中长按应用Activity的标题,将它拖到屏幕突出显示区域,可进入多窗口模式。
2. 多窗口下Activity的生命周期
多窗口模式下不会改变Android的生命周期,处于运行状态的Android也只会有一个(最近与用户交互的),其他的窗口的Activity虽然可见但还是处于暂停状态。当用户与另外一个窗口的Activity交互的时候,则之前的窗口的Activity则处于暂停状态(会调用onPause()方法),当前与用户交互的Activity处于运行状态(调用onResume()方法)。
默认情况下,在应用进入多窗口模式(自由形状模式)的时候Activity会重新创建,就像屏幕横竖屏切换一样,这时进入多窗口的Activity的生命周期为:
就像横竖屏切换一样,我们也可以通过设置当Activity进入多窗口时不重新创建,只需将Activity的configChange属性配置成一下即可
android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
程序进入多窗口模式,默认会创新创建,如下图:
设置android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"
,则进入多窗口模式Activity只会暂停不会重新创建
多窗口模式下切换交互窗口(这里只是点击了mutiwindow的Activity),可以看到当前mutiwindow处于顶级Activity(运行状态),而launchmode则调用则处于暂停状态
这时点击launchmode的Activity,同理,这时launchmode的Activity处于运行状态,mutiwindow的Activity则处于暂停状态。
3. 多窗口的相关配置
在开发Android N(7.0)的应用的时候,我们可以对Activity是否支持多窗口模式(开启或禁用)及显示方式进行一些配置。
(1)开启或禁用多窗口模式
通过Activity或Application的android:resizeableActivity属性配置可以开启(true)或禁用(false),该属性默认值为true,也就是说多窗口模式默认是被开启的。当Activity开启了多窗口模式时,它可以分屏显示并且可以自由改变大小,而被禁用多窗口模式的Activity总是以全屏显示。
android:resizeableActivity=["true" | "false"]
禁用多窗口模式下尝试进入多窗口模式,系统会提示App does`t support split screen(不支持分屏)
(2)布局属性layout
对于Android N,Activity标签可以配置一个layout的子标签,layout子标签的属性值会改变Activity在多窗口模式下的状态行为,如下面的配置就指定了Activity在多窗口模式下的默认大小,位置及最小尺寸。
<activity android:name=".SecondActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalHeight="450dp"
android:minimalWidth="300dp" />
</activity>
其中:
属性 | 作用 |
---|---|
android:defaultWidth | 以多窗口模式启动时 Activity 的默认宽度 |
android:defaultHeight | 以多窗口模式启动时 Activity 的默认高度 |
android:gravity | 以多窗口模式启动时 Activity 的初始位置。请参阅 Gravity 参考资料,了解合适的值设置。 |
android:minimalHeight、android:minimalWidth | 分屏和自由形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。 |
(3)被禁用的功能
- 某些系统 UI 自定义选项将被禁用;例如,在非全屏模式中,应用无法隐藏状态栏;
- 系统将忽略对 android:screenOrientation 属性所作的更改。
4. 多窗口模式状态监听
系统为我们提供了相应的监听方法以便我们可以判断Activity是否处于多窗口模式及进入退出多窗口模式时可以执行响应的业务逻辑。
- Activity.isInMultiWindowMode():判断Activity 是否处于多窗口模式。
- Activity.onMultiWindowModeChanged():Activity 进入或退出多窗口模式时系统将调用此方法。 在 Activity 进入多窗口模式时,系统向该方法传递 true 值,在退出多窗口模式时,则传递 false 值。
以上两个方法不仅在Activity可用,在Fragment也是同样可用的(Fragment版本)。
如:
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onPause() {
super.onPause();
if(isInMultiWindowMode()){
Toast.makeText(this,"进入多窗口模式",Toast.LENGTH_SHORT).show();
}
Log.d(TAG,"onPause()");
}
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onMultiWindowModeChanged(boolean isInMultiWindowMode) {
super.onMultiWindowModeChanged(isInMultiWindowMode);
if(isInMultiWindowMode()){
Toast.makeText(this,"进入多窗口模式",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"退出多窗口模式",Toast.LENGTH_SHORT).show();
}
}
则(注意需要打开多窗口支持android:resizeableActivity="true"
):