今年Google发布了Android N,Android N新增了不少功能,最受关注的自然就是分屏了。
这一功能对国内的很多手机用户并不陌生,其实很多第三方系统早已经实现了这一功能,如EMUI,Flyme等等。
分屏操作
在我的手机中,就可以一边看视频,一边浏览简书。Android N分屏功能的更新,似乎并不会对我国第三方Android系统带来多大的影响。毕竟厂商有自己实现这一功能的套路。
然而,谷歌反应的“缓慢”真的没有价值吗?其实不是的,Android N新增的功能是为其他第三方系统作出一个“标杆”。
这里举个例子,首先是分屏多任务,如今不同Android ROM实现该功能的方式不一,而且对软件的兼容也大有不同,所以体验也就可能差天共地(不能达到该有的标准),而Android N新增分屏多任务的支持,除了让第三方ROM开发商可以参照这个“模板”进行二次开发之外,软件开发人员也能根据Android N分屏多任务功能的实现方式去进行软件的开发。从而大大减少了自己摸索的时间,加快开发速度,由此支持该功能的软件会更多,兼容性也会更好。
分屏模式在Android电视中就变成了更为强大的画中画模式,终于可以一边看比赛直播,一边追电视剧了。
画中画
如何分屏呢
如果您的应用是使用 N Preview SDK 构建的,且未禁用多窗口支持,则应用默认支持分屏操作。
[代码]xml代码:
01
02
03
04
05
06
07
08
09
10
|
compileSdkVersion 'android-N' buildToolsVersion "24.0.0 rc4"
defaultConfig {
applicationId "com.yll520wcf.myapplication"
minSdkVersion 14
targetSdkVersion 'N'
versionCode 1
versionName "1.0"
}
|
用户可以通过以下方式切换到多窗口模式:
- 若用户打开最近任务列表(Overview 屏幕),并长按 Activity 标题,则可以拖动该 Activity 至屏幕突出显示的区域,使 Activity 进入多窗口模式。
- 若用户长按菜单按键(Overview 按钮),设备上的当前 Activity 将进入多窗口模式,同时将打开 最近任务列表(Overview 屏幕),用户可在该屏幕中选择要共享屏幕的另一个 Activity。
用户居然还可以在两个 Activity 共享屏幕的同时在这两个 Activity 之间拖放数据 (在此之前,用户只能在一个 Activity 内部拖放数据)。想想以后微博的图片直接拖到微信朋友圈中是不是很屌啊。
多窗口生命周期
还需要注意的是多窗口不会影响Activity的生命周期。
在多窗口模式中,在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为* Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的* Activity 将暂停。
在多窗口模式中,用户仍可以看到处于暂停状态的应用。 应用在暂停状态下可能仍需要继续其操作。
例如,处于暂停模式但可见的视频播放应用应继续显示视频。因此,我们建议播放视频的 Activity 不要在 onPause()方法中暂停视频,应在onStop()暂停视频播放,并在 onStart()中恢复视频播放。
用户使用多窗口模式显示应用时,系统将通知 Activity 发生配置变更。 该变更与系统通知应用设备从纵向模式切换到横向模式时的 Activity 生命周期影响基本相同,但设备不仅仅是交换尺寸,而是会变更尺寸。您的 Activity 可以自行处理配置变更,或允许系统销毁 Activity,并以新的尺寸重新创建该 Activity。
给Activity加上如下配置可以保证切换成多屏模式或者画中画模式时Activity不会销毁重建。
[代码]xml代码:
1
|
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"> |
针对多窗口进行配置
在清单文件的 <activity>或 <application>节点中设置该属性,启用或禁用多窗口显示:
[代码]xml代码:
1
|
android:resizeableActivity=["true" | "false"] |
如果该属性设置为 true,Activity 将能以分屏和*形状模式启动。 如果此属性设置为 false,Activity 将不支持多窗口模式。 如果该值为 false,且用户尝试在多窗口模式下启动 Activity,该 Activity 将全屏显示。
如果您的应用面向 Android N,但未对该属性指定值,则该属性的值默认设为 true。
如果做电视开发或其它特殊需求,还有一个属性需要注意:
[代码]xml代码:
1
|
android:supportsPictureInPicture=["true" | "false"] |
在清单文件的 <activity>节点中设置该属性,指明 Activity 是否支持画中画显示。如果 android:resizeableActivity为 false,将忽略该属性。
当然你还可以指定在*形状模式时 Activity 的默认大小、位置和最小尺寸:
[代码]xml代码:
1
2
3
|
< activity android:name = ".MainActivity" >
< layout android:defaultheight = "500dp" android:defaultwidth = "600dp" android:gravity = "top|end" android:minimalsize = "450dp" >
</ layout ></ activity >
|
对于 Android N,<layout>清单文件元素支持以下几种属性,这些属性影响 Activity 在多窗口模式中的行为:
- android:defaultWidth 以*形状模式启动时 Activity 的默认宽度。
- android:defaultHeight 以*形状模式启动时 Activity 的默认高度。
- android:gravity 以*形状模式启动时 Activity 的初始位置。
- android:minimalSize 分屏和*形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。
多窗口模式中运行应用注意事项
在设备处于多窗口模式中时,某些功能会被禁用或忽略,因为这些功能对与其他 Activity 或应用共享设备屏幕的 Activity 而言没有意义。 此类功能包括:
- 某些自定义选项将被禁用;例如,在非全屏模式中,应用无法隐藏状态栏。
- 系统将忽略对 android:screenOrientation属性所作的更改
Activity类中添加了以下新方法,以支持多窗口显示。
- Activity.inMultiWindow() 调用该方法以确认 Activity 是否处于多窗口模式。
- Activity.inPictureInPicture() 调用该方法以确认 Activity 是否处于画中画模式。注:画中画模式是多窗口模式的特例。 如果 myActivity.inPictureInPicture()返回 true,则 myActivity.inMultiWindow()也返回 true。
- Activity.onMultiWindowChanged() Activity 进入或退出多窗口模式时系统将调用此方法。 在 Activity 进入多窗口模式时,系统向该方法传递 true 值,在退出多窗口模式时,则传递 false 值。
- Activity.onPictureInPictureChanged() Activity 进入或退出画中画模式时系统将调用此方法。 在 Activity 进入画中画模式时,系统向该方法传递 true 值,在退出画中画模式时,则传递 false 值。
每个方法还有 Fragment版本,例如 Fragment.inMultiWindow()。
在多窗口模式中启动新 Activity
在启动新 Activity 时,用户可以提示系统如果可能,应将新 Activity 显示在当前 Activity 旁边。 要执行此操作,可使用标志Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。传递此标志将请求以下行为:
- 如果设备处于分屏模式,系统会尝试在启动系统的 Activity 旁创建新 Activity,这样两个 Activity 将共享屏幕。 系统并不一定能实现此操作,但如果可以,系统将使两个 Activity 处于相邻的位置。
- 如果设备不处于分屏模式,则该标志无效。
[代码]java代码:
1
2
3
4
5
6
7
|
public void click(View v){
Intent intent= new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT);
intent.setData(Uri.parse( "http://www.baidu.com" ));
startActivity(intent);
} |
Paste_Image.png
支持拖放
用户可以在两个 Activity 共享屏幕的同时在这两个 Activity 之间拖放。因此,如果您的应用目前不支持拖放功能,您可以在其中添加此功能。
- 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 的权限。