Android Developers-开发-API指南-用户界面-多窗口支持: https://developer.android.google.cn/guide/topics/ui/multi-window.html#running
Android N App分屏模式完全解析(上)作者:UncleChen
http://unclechen.github.io/2016/03/12/Android%20N%20App%E5%88%86%E5%B1%8F%E6%A8%A1%E5%BC%8F%E5%AE%8C%E5%85%A8%E8%A7%A3%E6%9E%90-%E4%B8%8A%E7%AF%87/
Android N App分屏模式完全解析(下)作者:UncleChen
http://unclechen.github.io/2016/03/12/Android%20N%20App%E5%88%86%E5%B1%8F%E6%A8%A1%E5%BC%8F%E5%AE%8C%E5%85%A8%E8%A7%A3%E6%9E%90-%E4%B8%8B%E7%AF%87/
最近小米6更新了MIUI9,MIUI开放了分屏功能…于是拿分屏功能体验了下…
emmmm…
迭代开发1年多的APP,先是不支持分屏,开启分屏功能后就跪在了登录界面,真是惨烈啊.
这…..
于是就对于Android 分屏功能进行了相关的学习.
1. APP是否支持分屏及如何开启.
主要分成3种情况
- 大部分的情况即 不支持分屏
- 支持分屏的情况下,分2种.
- 完全没有适配Android N,当在清单文件内没有对Activity进行
android:screenOrientation="XXX"
设置时,是默认支持分屏的. - 适配Android N(至少compileSdkVersion>23)时,在清单文件内配置
android:resizeableActivity=["true" | "false"]
为true时,及可支持分屏功能.
- 完全没有适配Android N,当在清单文件内没有对Activity进行
引用UncleChen的文章
注意:假如你没有适配到Android N(targetSDKVersion < Android N),打包App时的compileSDKVersion < Android N,你的App也是可以支持分屏的!!!!原因在于:如果你的App没有 设置 仅允许Activity竖屏/横屏,即没有设置类型android:screenOrieAndroid分屏功能,适配及相关问题运行时的稳定性的,在进入分屏模式时,系统首先也会弹出Toast来提示你说明这个风险。
这也是为什么我自己进行尝试,发现同样配置version,同样的没有进行配置resizeableActivity时,发现 项目不行,随便写的一个Demo可以的原因.
2.分屏模式的适配问题
既然找到了原因及支持了分屏功能,拿APP试试,爽一把再说.
emmm….
自己的APP 登录界面就跪了…
看看了手机里面,找到常用的APP(多看阅读,QQ和今日头条)
取消手机的 方向锁定.
- 多看阅读.
支持分屏功能,横竖屏切换,默认为竖屏,说明设置了screenOrientation,且设置内有切换为默认横屏的选项.说明对分屏功能进行了支持.切换各个页面,因为使用了大量的scrollView等可滑动的组件,表现完美. QQ.
支持分屏功能,横竖屏切换,默认为竖屏,说明设置了screenOrientation,说明对分屏功能进行了支持.切换tab,上下滑动均表现完美,使用Android Device Monitor对QQ进行分析,发现均使用了AbsListView.但是在登录页面,发现和自己APP一样的问题,不适配.
今日头条.
和QQ表现一致,同样是支持分屏功能,但是不搞事怎么行,发现在设置个人资料时也出现了 无法上下滑动,不适配的问题.
看到这么多APP出现问题,心里舒服多了.
通过分析上面的APP,发现当界面是ScrollView,ListView,RecyclerView这种能够滑动的页面时,分屏功能表现良好.
但是当出现固定高度,如设置页面,登录页面时,就会出现折叠,无法滑动被遮挡等适配问题.
需要注意的是,在支持分屏功能后,APP会
- 某些系统 UI 自定义选项将被禁用;例如,在非全屏模式中,应用无法隐藏状态栏。
- 系统将忽略对 android:screenOrientation 属性所作的更改。
一些可以通过使用ScrollView来进行解决,但登录界面折叠,通过官方文档,有提到默认尺寸设置,个人感觉可以通过这个方法进行解决.
如下设置:
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
//分屏和自由形状模式中 Activity 的最小高度和最小宽度。 如果用户在分屏模式中移动分界线,使 Activity 尺寸低于指定的最小值,系统会将 Activity 裁剪为用户请求的尺寸。
android:minimalHeight="450dp"
android:minimalWidth="300dp" />
</activity>
待解决:
我通过对自己项目的登录页面进行设置分屏模式默认尺寸,发现在编译完成后,出现错误…
然后发现在build/intermediates/manifest/XXX/debug/AndroidManifest.xml出现错误.
不存在???还有这种操作?
有谁解决了这个问题,欢迎留言.
3. 分屏模式,多窗口开启Activity.
即分屏模式,当前APP跳转到新Activity,能直接将跳转的新的Activity显示在另外一个分屏上面.
听上去就酷炫吊炸天.
找到 官方文档描述:
在启动新 Activity 时,用户可以提示系统如果可能,应将新 Activity 显示在当前 Activity 旁边。 要执行此操作,可使用标志 Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT。
嗯,setFlag()即可,方便简单.
巴特…并不行.
emmmm…
其实需要这样:
注意!是 Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT,并不是TO_ADJACENT(官方正式神坑,还好我是输入adj自动匹配出来的)
intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
至于为什么需要额外添加一个Intent.FLAG_ACTIVITY_NEW_TASK
官方解释是这样的(谷歌爸爸为什么不在官方文档就写清楚???):
注意:在同一个Activity返回栈中,打开一个新的Activity时,这个Activity将会继承上一个Activity所有和分屏模式有关的属性。如果你想要在一个独立的窗口以分屏模式打开一个新的Activity,那么必须新建一个Activity返回栈。
5.分屏模式下的生命周期
引用官方的话就是:
当前操作的Activity将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。 但是,这些已暂停但可见的 Activity 在系统中享有比不可见 Activity 更高的优先级。 如果用户与其中一个暂停的 Activity 交互,该 Activity 将恢复,而之前的顶级 Activity 将暂停。
注:在多窗口模式中,用户仍可以看到处于暂停状态的应用。 应用在暂停状态下可能仍需要继续其操作。 例如,处于暂停模式但可见的视频播放应用应继续显示视频。 因此,我们建议播放视频的 Activity 不要暂停其 onPause() 处理程序中的视频。 应暂停 onStop() 中的视频,并恢复 onStart() 中的视频播放。
写在最后,
感觉分屏功能大屏手机可能用起来更加舒服,5.2寸的手机用起来,感觉略鸡肋,想了半天,唯一能想到的场景也就是 一边手游挂机,一遍手机看小说了.
但是…支持分屏功能的手游实在是太少了(支持横竖屏切换,适配了横竖屏,2套布局)..这么多年,才碰到过一个.
只希望这个功能以后能有更多扩展吧(Android O PIP功能一样).