今年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"
 }

用户可以通过以下方式切换到多窗口模式:

  1. 若用户打开最近任务列表(Overview 屏幕),并长按 Activity 标题,则可以拖动该 Activity 至屏幕突出显示的区域,使 Activity 进入多窗口模式。
  2. 若用户长按菜单按键(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 在多窗口模式中的行为:

  1. android:defaultWidth 以自由形状模式启动时 Activity 的默认宽度。
  2. android:defaultHeight 以自由形状模式启动时 Activity 的默认高度。
  3. android:gravity 以自由形状模式启动时 Activity 的初始位置。
  4. android:minimalSize 分屏和自由形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。

多窗口模式中运行应用注意事项

在设备处于多窗口模式中时,某些功能会被禁用或忽略,因为这些功能对与其他 Activity 或应用共享设备屏幕的 Activity 而言没有意义。 此类功能包括:

  1. 某些自定义选项将被禁用;例如,在非全屏模式中,应用无法隐藏状态栏。
  2. 系统将忽略对 android:screenOrientation属性所作的更改

Activity类中添加了以下新方法,以支持多窗口显示。

  1. Activity.inMultiWindow() 调用该方法以确认 Activity 是否处于多窗口模式。
  2. Activity.inPictureInPicture() 调用该方法以确认 Activity 是否处于画中画模式。注:画中画模式是多窗口模式的特例。 如果 myActivity.inPictureInPicture()返回 true,则 myActivity.inMultiWindow()也返回 true。
  3. Activity.onMultiWindowChanged() Activity 进入或退出多窗口模式时系统将调用此方法。 在 Activity 进入多窗口模式时,系统向该方法传递 true 值,在退出多窗口模式时,则传递 false 值。
  4. Activity.onPictureInPictureChanged() Activity 进入或退出画中画模式时系统将调用此方法。 在 Activity 进入画中画模式时,系统向该方法传递 true 值,在退出画中画模式时,则传递 false 值。

每个方法还有 Fragment版本,例如 Fragment.inMultiWindow()。

在多窗口模式中启动新 Activity

在启动新 Activity 时,用户可以提示系统如果可能,应将新 Activity 显示在当前 Activity 旁边。 要执行此操作,可使用标志Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。传递此标志将请求以下行为:

  1. 如果设备处于分屏模式,系统会尝试在启动系统的 Activity 旁创建新 Activity,这样两个 Activity 将共享屏幕。 系统并不一定能实现此操作,但如果可以,系统将使两个 Activity 处于相邻的位置。
  2. 如果设备不处于分屏模式,则该标志无效。

[代码]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 之间拖放。因此,如果您的应用目前不支持拖放功能,您可以在其中添加此功能。

    1. android.view.DropPermissions令牌对象,负责指定对接收拖放数据的应用授予的权限。
    2. View.startDragAndDrop() View.startDrag()的新别名。要启用跨 Activity 拖放,请传递新标志 View.DRAG_FLAG_GLOBAL。如需对接收拖放数据的 Activity 授予 URI 权限,可根据情况传递新标志View.DRAG_FLAG_GLOBAL_URI_READ或 View.DRAG_FLAG_GLOBAL_URI_WRITE。
    3. View.cancelDragAndDrop() 取消当前正在进行的拖动操作。只能由发起拖动操作的应用调用。
    4. View.updateDragShadow() 替换当前正在进行的拖动操作的拖动阴影。只能由发起拖动操作的应用调用。
    5. Activity.requestDropPermissions() 请求使用 DragEvent中包含的 ClipData传递的内容 URI 的权限。

是时候学习Android分屏开发了的更多相关文章

  1. android分屏

    上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Android7.0原生系统就可以支持两个App横屏并排或者竖屏上下摆放了.第二个新特性就是在Android TV ...

  2. 粮草先行——Android折叠屏开发技术点(一)

    最近有关折叠屏产品的新闻层出不穷,各家手机厂商也分别慢慢地亮出了自家的产品.然而市场上的一些APP仍然没有很好地适配这样的设备,显示不正常和应用重启的状况时有发生.因此,我会用接下来的几篇文章来点出有 ...

  3. Android分屏显示LogCat

    Eclipse里有非常多界面组件,文件列表.编辑区.类结构等等,在这么多界面组件里,再打开一个Logcat就基本没有什么空间了.与其挤在一起还不如分开成两个窗体. 或者你有两个屏幕,想一个屏幕编辑,一 ...

  4. JAVA GUI学习 - JSplitPane分屏组件学习

    public class JSplitPaneKnow extends JFrame { JSplitPane jSplitPane; JPanel jPanelRed; JPanel jPanelB ...

  5. 粮草先行——Android折叠屏开发技术点(二)

    继该系列的第一篇和番外篇之后,今天我们来聊一聊多窗口开发的注意事项.实际上,与其说"多窗口开发",不如说让我们的APP适应多窗口模式. 可能有朋友会问,为什么要提到多窗口模式呢? ...

  6. 粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则

    上一篇文章中,我们有提到Activity在屏幕尺寸发生变更时的处理方式,总共有两种: 重启APP以适应屏幕改变: 手动处理数据,避免APP重启. 同样,这两种方式也同时适用于改变屏幕方向.更改系统语言 ...

  7. openfire Android学习---android客户端聊天开发之登录 和 注销登录

    一切就绪,新建一个android测试工程: 上网权限配置,界面绘制啥的,这里就不说了. 首先 导入一个smark包.这个是用来维护长连接的,也可以是asmark.我用的是asmark 先普及一些基本知 ...

  8. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

  9. Android系统的三种分屏显示模式

    Google在Android 7.0中引入了一个新特性——多窗口支持,允许用户一次在屏幕上打开两个应用.在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示.在电视设备 ...

随机推荐

  1. uva 10626

    dp 记忆化搜索 3个1元和1个10元的情况不能少 #include <cstdio> #include <cstdlib> #include <cmath> #i ...

  2. 国内一些SCM相关论坛站点

    SCMROAD: http://www.scmroad.com/forum.php SCMEYE:http://www.scmeye.com/ SVN管家:http://www.svnclub.com ...

  3. 全球说:要给 OneAlert 点100个赞

    客户背景 「全球说」 Talkmate,是北京酷语时代教育科技有限公司(酷语科技)旗下产品,酷语科技是一家诞生于中国的语言技术公司,致力于为全球用户提供一个全新的多语言学习和社交网络平台 . 全球说是 ...

  4. POJ2104 k-th number 划分树

    又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...

  5. Network Saboteur(Rand版)

    poj2531:http://poj.org/problem?id=2531 题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大.题解:随机算法 #includ ...

  6. hdu 2065 "红色病毒"问题

    指数型母函数的应用 求A B C D 在规定条件下n个元素的排列个数,先写出指数型母函数 G(X) = ( 1 + x + x^2/2! + x^3/3! +... )^2 * ( 1+ x^2/2! ...

  7. 【转载】synchronized 与 Lock 的那点事

    最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...

  8. 如何配置svn服务器

    如果你已经安装好了VisualServer服务器,现在让我们一起来配置svn服务器吧. 工具/原料 VisualServer 配置VisualServer 找到VisualServer Manager ...

  9. Qt 添加外部库文件(四种方法)

    Qt添加外部库文件, 一种就是直接加库文件的绝对路劲,这种方法简单,但是遇到多个库文件的时候,会很麻烦,而且,如果工程移动位置以后还需要重新配置 另一种就是相对路径了,不过Qt 编译的文件会在一个单独 ...

  10. C++定义全局变量/常量几种方法的区别

    在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块):    在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ER ...