现在的手机屏幕越来越大,使得在屏幕上同时开多个窗口不再奢侈,因此Android从7.0开始顺势推出了分屏功能,也被称作多窗口模式。比如把竖长的手机屏幕分成上下两个窗口,一边在上面的窗口中观看电影,一边在下面的窗口中聊天,可谓娱乐、工作两不误。那么分屏功能需要开发者进行哪些适配工作呢?接下来就详细阐述如何开关分屏模式,以及在编码的时候有哪些注意的地方。

首先准备一部Android7.0及以上版本的手机,按下屏幕底部的任务键,此时屏幕下方会弹出一排的任务列表。这个任务界面仿佛跟低版本的手机没什么不同,再瞅瞅屏幕上方有没有什么异样,是不是在左上角看到了一个“分屏模式”的按钮?

赶紧点击该按钮,这时屏幕上方变了一排的颜色,还有文字提示“拖动应用到此处”,好像看电影拉下了一片幕布。

然后用手指从下面拖动一个任务拉到这块幕布区域,该任务的界面立即填满了屏幕的上半部分。继续点击任务列表里的任何一个App,此刻被选中的App马上展示到了屏幕的下半部分。于是整个手机屏幕分成了上下两个窗口,每个窗口各自运行自己的App界面,从而实现了对屏幕进行分屏的操作。

分屏后的两个App,用户可以像往常一样点击、刷新和后退。要是玩腻了分屏,也可按下任务键,此时屏幕顶端中央浮现出了一个“退出分屏”的按钮,点击该按钮即可恢复原来的全屏模式。

以上的演示步骤,是教用户如何开启和关闭全屏模式。对于开发者来说,Android官方给出了以下的编码建议:
1、一般情况下,App默认都允许分屏模式。但有的开发者认为自己的App只有在全屏状态下才能正常使用,要是被分屏的话用起来会很难受,这时候就得对该App禁用分屏模式。具体操作是在AndroidManifest.xml的application节点添加属性android:resizeableActivity="false",表示应用页面不接受分屏;如此一来,即使用户开启了分屏模式,切换到该应用时仍会强制回到全屏模式。
2、App页面从全屏模式切换到分屏模式,它的Activity生命周期会经历销毁后重建的过程,如果开发者想保持App页面在分屏前的模样,则需给该页面的activity节点加上以下的属性描述,告知系统不要对这个页面动手动脚:

    android:configChanges="screenLayout|orientation"

3、对于视频播放页面,建议Activity代码不在onPause方法中暂停播放视频,而应当在onStop方法中暂停播放,并在onStart方法中恢复播放视频。
4、App运行过程中,若想获知当前是否处于分屏模式,则可调用isInMultiWindowMode方法,该方法返回true表示处于分屏模式,返回false表示处于全屏模式。
5、每当进入多窗口,或者退出多窗口的时候,应用会触发Activity页面的onMultiWindowModeChanged方法。通过重载该方法,开发者可以即时收到分屏与全屏的切换通知。

然而上面的编码建议只给出了结果,却没说明原因,着实令人云里雾里。为更好地理解分屏时候的业务流程,读者不妨在Activity代码中打印生命周期的每个方法日志,从而观察发现其中的缘由。笔者这边补充日志打印后的观察结果如下:
1、App未增加任何分屏设置,则按下任务键后的生命周期为“onPause->onStop”;接着把App拖进分屏窗口,此时的生命周期为“onDestroy->onCreate->onStart->onStart->onMultiWindowModeChanged->onResume”。
2、App的页面在activity节点设置configChanges属性,则按下任务键后的生命周期仍为“onPause->onStop”,但拖进分屏窗口时候的生命周期变更为“onStart->onResume”。
3、分屏模式之下,先把A应用拖到上面的分窗口,再在下面的分窗口中打开B应用,日志显示A应用经历了“onPause->onResume”的过程。这是因为Android在任一时刻只能有唯一的Activity处于活动状态,分屏模式下打开B应用的时候,系统会先暂停A的页面,然后加载B的页面,等到B页面加载完,才去恢复A页面。
从上述的观察结果可知,App的多数功能不受分屏生命周期的影响,但视频播放是个例外。因为通常开发者会在页面暂停时也暂停播放视频,等到页面恢复时再恢复播放视频。可是一旦遇到分屏的情况,用户一边看视频,一边在另一个窗口办事,这意味着视频播放页面会经常处于“先暂停再恢复”的状态。尽管多数情况用户难以意识到微小的中断,对手机而言却是巨大的资源消耗,因此处理视频播放的时候,最好在onStop方法中停止播放,在onStart方法中恢复播放,这样才能避免分屏带来的中断困扰。

总结一下,Android7.0带来的分屏功能,主要影响到视频播放页面的编码,具体来说要进行以下两点修改:
1、对于视频播放页面,需要在它的activity节点加上如下属性描述,表示分屏与全屏切换之时保持视频页的内容:

    android:configChanges="screenLayout|orientation"

2、遇到生命周期变化导致视频暂停和恢复播放的情况,要在onStop方法中暂停播放视频,而不是在onPause方法中暂停;同理,要在onStart方法中恢复播放视频,而不是在onResume方法中恢复,以避免无谓的资源浪费。改写后的视频播放控制代码示例如下:

    private int mCurrentPosition = 0;// 兼容分屏模式。当前页面被拖到分屏窗口中,就立即恢复播放视频@Overrideprotected void onStart() {super.onStart();if (mCurrentPosition>0 && !vv_content.isPlaying()) {vv_content.seekTo(mCurrentPosition);vv_content.start();}}// 兼容分屏模式。App处于停止状态时,则保存当前的播放进度@Overrideprotected void onStop() {super.onStop();if (vv_content.isPlaying()) {mCurrentPosition = vv_content.getCurrentPosition();vv_content.pause();}}

点此查看Android开发笔记的完整目录

__________________________________________________________________________
本文现已同步发布到微信公众号“老欧说安卓”,打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。

Android开发笔记(一百五十九)Android7.0的分屏模式相关推荐

  1. Android开发笔记(五十九)巧用传感器

    传感器Sensor 传感器是Android用来感知周围环境以及运动信息的工具.因为具体的感应信息依赖于相关硬件,所以虽然Android提供了众多的感应器,但不是每部手机都能支持这么多感应器,恰恰相反, ...

  2. Android开发笔记(七十九)资源与权限校验

    硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...

  3. Android开发笔记(八十九)单例模式

    基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...

  4. Android开发笔记(五十八)铃声与震动

    拖动条SeekBar SeekBar继承自进度条ProcessBar,有关ProcessBar的介绍见<Android开发笔记(四十九)异步任务处理AsyncTask>.SeekBar与P ...

  5. Android开发笔记(五十四)数据共享接口ContentProvider

    ContentProvider 前面几节介绍了进程间通信的几种方式,包括消息包级别的Messenger.接口调用级别的AIDL.启动页面/服务级别的Notification,还有就是本节这个数据库级别 ...

  6. Android开发笔记(五十二)通知推送Notification

    PendingIntent 准备工作复习一下PendingIntent,前面的博文< Android开发笔记(五十)定时器AlarmManager>已经提到了它.PendingIntent ...

  7. Android开发笔记(六十九)JNI实战

    NDK NDK的用途 NDK全称为Native Development Kit,意即原生的开发工具,NDK允许开发者在APP中通过C/C++代码执行部分程序.它是Android提供的方便开发者通过JN ...

  8. Android开发笔记(五十六)摄像头拍照

    相机Camera Camera是直接操作摄像头硬件的工具类.常用的方法如下: getNumberOfCameras : 获取本机的摄像头数目 open : 打开摄像头,默认打开后置摄像头.如果有多个摄 ...

  9. Android开发笔记(五十五)手机设备基本操作

    获取手机基本信息 手机的基本信息分两类,一类是与电话有关的信息,另一类是设备自身的信息. 与电话有关的信息可由TelephonyManager类获得,常用的参数与对应的方法如下所示: 网络运营商名称 ...

最新文章

  1. 创新工场提出中文分词和词性标注模型,性能分别刷新五大数据集| ACL 2020​
  2. 裸奔浏览器_大概是最好用的隐私浏览器 - Firefox Focus
  3. IOS文本框readonly时焦点事件
  4. 我在 SUN TECH DAY
  5. 2022.2.21显示器连接器引脚信号定义1
  6. AnkhSVN 1.0.2778 简体中文版发布
  7. fabric零碎知识
  8. EclipseLink MOXy和用于JSON处理的Java API –对象模型API
  9. 文件后缀可见的设置 强转文件类型
  10. 孩子上了高一突然学不懂了,该怎么办?
  11. ProxyToken:微软 Exchange 服务器中的认证绕过新漏洞,可窃取用户邮件
  12. HTML5的视频格式之争
  13. java中常用的缓存流程、缓存分类、缓存问题
  14. 一个牛人给的java九点建议
  15. Ubuntu16.04 与本地Win7共享文件夹
  16. 【字节前端青训营】跟着月影学JavaScript——前端代码优化三大原则之各司其职,夜间模式小案例
  17. 使用 Scrapy 框架对重复的 url 无法获取数据,dont_filter=True
  18. 基于Yocto的qmake编译环境默认QMAKE_SPEC不是linux-oe-g++的问题
  19. Linux下随机生成密码的命令总结
  20. Matlab符号数学Symbolic Math Toolbox™帮助文档(全)

热门文章

  1. 细说浏览器特性检测(1)-jQuery1.4添加部分
  2. table中添加下拉框
  3. mlfviewer_语音识别ASR - HTK(HResults)计算字错率WER、句错率SER
  4. 单元格填充为0的html,Excel如何在数据信息表中把空单元格填写为数字“0”
  5. notepad怎么设置python为环境变量_notepad
  6. 路由器 android 打印机,谷歌关闭云打印服务,安卓和Chrome办公用户要慌了
  7. vue中使用lazyload实现图片懒加载
  8. spring异常处理实例(登录例子)
  9. java sql 创建触发器_SQL Server创建触发器
  10. mysql 索引表的应用_MySQL查询优化之索引的应用详解