Android分屏功能,适配及相关问题


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种.
    1. 完全没有适配Android N,当在清单文件内没有对Activity进行android:screenOrientation="XXX"设置时,是默认支持分屏的.
    2. 适配Android N(至少compileSdkVersion>23)时,在清单文件内配置android:resizeableActivity=["true" | "false"]为true时,及可支持分屏功能.

引用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登录分屏不适配

  • 今日头条.
    和QQ表现一致,同样是支持分屏功能,但是不搞事怎么行,发现在设置个人资料时也出现了 无法上下滑动,不适配的问题.
    今日头条设置分屏不适配

看到这么多APP出现问题,心里舒服多了.
通过分析上面的APP,发现当界面是ScrollView,ListView,RecyclerView这种能够滑动的页面时,分屏功能表现良好.
但是当出现固定高度,如设置页面,登录页面时,就会出现折叠,无法滑动被遮挡等适配问题.

需要注意的是,在支持分屏功能后,APP会
  1. 某些系统 UI 自定义选项将被禁用;例如,在非全屏模式中,应用无法隐藏状态栏。
  2. 系统将忽略对 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功能一样).

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值