Android编程开发技巧之Android7.0的分屏模式
程序员文章站
2022-04-12 08:42:48
现在的手机屏幕越来越大,使得在屏幕上同时开多个窗口不再奢侈,因此Android从7.0开始顺势推出了分屏功能,也被称作多窗口模式。比如把竖长的手机屏幕分成上下两个窗口,一边在上面的...
现在的手机屏幕越来越大,使得在屏幕上同时开多个窗口不再奢侈,因此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节点加上以下的属性描述,告知系统不要对这个页面动手动脚:
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节点加上如下属性描述,表示分屏与全屏切换之时保持视频页的内容:
首先准备一部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; // 兼容分屏模式。当前页面被拖到分屏窗口中,就立即恢复播放视频 @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(); } }