Android 多窗口支持
效果图:
系统环境
android系统版本不低于7.0,api不低于25
效果描述
Android N 添加了对同时显示多个应用窗口的支持。 在手持设备上,两个应用可以在“分屏”模式中左右并排或上下并排显示(见效果图)。 在电视设备上,应用可以使用“画中画”模式,在用户与另一个应用交互的同时继续播放视频(没有测试)。
开启方法
点击手机菜单键进入运行中app的管理页面,然后长按Activity标题,则可以拖动该 Activity 至屏幕突出显示的区域,使 Activity 进入多窗口模式。
生命周期
在多窗口模式下,只有最近被操作过的Activity才是顶级Activity,其他app的Activity虽然可见,但已处于暂停状态,但这些Activity比那些不可见的Activity享有更高的优先级。如果处于暂停状态的Activity被用户点击,那会变成顶级Activity,之前的会被暂定,只会有一个顶级Activity。
注:在多窗口模式中,用户仍可以看到处于暂停状态的应用。 应用在暂停状态下可能仍需要继续其操作。 例如,处于暂停模式但可见的视频播放应用应继续显示视频。 因此,我们建议播放视频的 Activity 不要暂停其 onPause() 处理程序中的视频。 应暂停 onStop() 中的视频,并恢复 onStart() 中的视频播放。
实现支持多窗口模式
在清单的 或 节点中设置该属性,启用或禁用多窗口显示:android:resizeableActivity=[“true” | “false”],默认是true,如果想要全屏显示,一定要设置为android:resizeableActivity=”false”
实现画中画显示
android:supportsPictureInPicture
在清单文件的 节点中设置该属性,指明 Activity 是否支持画中画显示。 如果 android:resizeableActivity 为 false,将忽略该属性。
android:supportsPictureInPicture=[“true” | “false”]
布局属性
对于 Android N, 清单元素支持以下几种属性,这些属性影响 Activity 在多窗口模式中的行为:
android:defaultWidth
以自由形状模式启动时 Activity 的默认宽度。android:defaultHeight
以自由形状模式启动时 Activity 的默认高度。android:gravity
以自由形状模式启动时 Activity 的初始位置。请参阅 Gravity 参考资料,了解合适的值设置。android:minimalHeight、android:minimalWidth
分屏和自由形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。
例如,以下节点显示了如何指定 Activity 在自由形状模式中显示时 Activity 的默认大小、位置和最小尺寸:
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalHeight="450dp"
android:minimalWidth="300dp" />
多窗口模式中被禁用的功能
在设备处于多窗口模式中时,某些功能会被禁用或忽略,因为这些功能对与其他 Activity 或应用共享设备屏幕的 Activity 而言没有意义。 此类功能包括:
某些系统 UI 自定义选项将被禁用;例如,在非全屏模式中,应用无法隐藏状态栏。
系统将忽略对 android:screenOrientation 属性所作的更改。
多窗口变更通知和查询
Activity 类中添加了以下新方法,以支持多窗口显示。 有关各方法的详细信息,请参阅 N Preview SDK 参考。
Activity.isInMultiWindowMode()
调用该方法以确认 Activity 是否处于多窗口模式。Activity.isInPictureInPictureMode()
调用该方法以确认 Activity 是否处于画中画模式。注:画中画模式是多窗口模式的特例。 如果 myActivity.isInPictureInPictureMode() 返回 true,则 myActivity.isInMultiWindowMode() 也返回 true。
Activity.onMultiWindowModeChanged()
Activity 进入或退出多窗口模式时系统将调用此方法。 在 Activity 进入多窗口模式时,系统向该方法传递 true 值,在退出多窗口模式时,则传递 false 值。Activity.onPictureInPictureModeChanged()
Activity 进入或退出画中画模式时系统将调用此方法。 在 Activity 进入画中画模式时,系统向该方法传递 true 值,在退出画中画模式时,则传递 false 值。
每个方法还有 Fragment 版本,例如 Fragment.isInMultiWindowMode()。
进入画中画模式
如需在画中画模式中启动 Activity,请调用新方法 Activity.enterPictureInPictureMode()。 如果设备不支持画中画模式,则此方法无效。 如需了解详细信息,请参阅画中画文档。
在多窗口模式中启动新 Activity
在启动新 Activity 时,用户可以提示系统如果可能,应将新 Activity 显示在当前 Activity 旁边。 要执行此操作,可使用标志 Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。 传递此标志将请求以下行为:如果设备处于分屏模式,系统会尝试在启动系统的 Activity 旁创建新 Activity,这样两个 Activity 将共享屏幕。 系统并不一定能实现此操作,但如果可以,系统将使两个 Activity 处于相邻的位置。
如果设备不处于分屏模式,则该标志无效。
如果设备处于自由形状模式,则在启动新 Activity 时,用户可通过调用 ActivityOptions.setLaunchBounds() 指定新 Activity 的尺寸和屏幕位置。 如果设备不处于多窗口模式,则该方法无效。注:如果您在任务栈中启动 Activity,该 Activity 将替换屏幕上的 Activity,并继承其所有的多窗口属性。 如果要在多窗口模式中以单独的窗口启动新 Activity,则必须在新的任务栈中启动此 Activity。
支持拖放
用户可以在两个 Activity 共享屏幕的同时在这两个 Activity 之间拖放数据 (在此之前,用户只能在一个 Activity 内部拖放数据)。 因此,如果您的应用目前不支持拖放功能,您可以在其中添加此功能。
N Preview SDK 扩展了 android.view 软件包,以支持跨应用拖放。 有关以下类和方法的详细信息,请参阅 N Preview SDK 参考。
android.view.DropPermissions
令牌对象,负责指定对接收拖放数据的应用授予的权限。View.startDragAndDrop() 是View.startDrag() 的新别名。启用跨 Activity 拖放,请传递新标志 View.DRAG_FLAG_GLOBAL。 如需对接收拖放数据的 Activity 授予 URI 权限,可传递新标志
View.DRAG_FLAG_GLOBAL_URI_READ 或View.DRAG_FLAG_GLOBAL_URI_WRITE。View.cancelDragAndDrop()
取消当前正在进行的拖动操作。只能由发起拖动操作的应用调用。View.updateDragShadow()
替换当前正在进行的拖动操作的拖动阴影。只能由发起拖动操作的应用调用。Activity.requestDropPermissions()
请求使用 DragEvent 中包含的 ClipData 传递的内容 URI 的权限。
使用小结
如果写的有问题的地方,帮忙指正,谢谢
我是在模拟器上测试的,没有7.0的手机,现在所谓的多窗口只能支持两个app窗口,没有找到显示数量的设置方法,其他的没怎么去仔细验证,做一下初步了解,像我们现在没有适配7.0的应用,如果装到7.0的手机上,时直接使用多窗口模式的,所有如果要适配的话,所以父布局最好是ScrollView布局,以免多窗口显示时有些布局显示不完整。