欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程开发技巧之Android7.0的分屏模式

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

首先准备一部Android7.0及以上版本的手机,按下屏幕底部的任务键,此时屏幕下方会弹出一排的任务列表。这个任务界面仿佛跟低版本的手机没什么不同,再瞅瞅屏幕上方有没有什么异样,是不是在左上角看到了一个“分屏模式”的按钮?
Android编程开发技巧之Android7.0的分屏模式
赶紧点击该按钮,这时屏幕上方变了一排的颜色,还有文字提示“拖动应用到此处”,好像看电影拉下了一片幕布。
Android编程开发技巧之Android7.0的分屏模式
然后用手指从下面拖动一个任务拉到这块幕布区域,该任务的界面立即填满了屏幕的上半部分。继续点击任务列表里的任何一个App,此刻被选中的App马上展示到了屏幕的下半部分。于是整个手机屏幕分成了上下两个窗口,每个窗口各自运行自己的App界面,从而实现了对屏幕进行分屏的操作。
Android编程开发技巧之Android7.0的分屏模式
分屏后的两个App,用户可以像往常一样点击、刷新和后退。要是玩腻了分屏,也可按下任务键,此时屏幕顶端*浮现出了一个“退出分屏”的按钮,点击该按钮即可恢复原来的全屏模式。
Android编程开发技巧之Android7.0的分屏模式

以上的演示步骤,是教用户如何开启和关闭全屏模式。对于开发者来说,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;
    
    // 兼容分屏模式。当前页面被拖到分屏窗口中,就立即恢复播放视频
    @Override
    protected void onStart() {
        super.onStart();
        if (mCurrentPosition>0 && !vv_content.isPlaying()) {
            vv_content.seekTo(mCurrentPosition);
            vv_content.start();
        }
    }

    // 兼容分屏模式。App处于停止状态时,则保存当前的播放进度
    @Override
    protected void onStop() {
        super.onStop();
        if (vv_content.isPlaying()) {
            mCurrentPosition = vv_content.getCurrentPosition();
            vv_content.pause();
        }
    }