一、序
大家好,我是承香墨影。不瞒大家说,我已经在湖北待了 2 个多月了。
前期一直处于封禁状态,随着疫情的好转,现在已经可以出去吃碗热干面了。
在家远程办公的这段时间,除了正常的工作学习之外,精神娱乐也少不了,肉身和空间上的限制,也无法阻碍对精神世界的追求。但无论怎么玩出了花样,多数时候还是脱离不了手机这个小小的屏幕。
最近我深度体验了 Android 中的一个功能,一个以前让我嗤之以鼻,觉得没有任何大用的功能,最近深度体验之后,发现真香。
这个功能就是 Android 的分屏功能。在家的这段时间,发现大概只有手机的屏幕,才是自己能够独享的。
虽然 App 之间的切换,已经可以做到非常的顺畅,但是如果你在刷剧的时候还要切到微信回复消息,之后再切回来,这样的体验无疑是非常差的。还别说有时候我无法忍受剧情的拖沓,总想着看着剧的同时再干点什么,例如刷个淘宝京东什么的。
这种需求,分屏模式就可以满足。
上图中就是我比较常用的 2 个场景,刷剧和游戏之余,还想干点别的,例如聊天、购物等等。
那我们今天就来聊聊 Android 的多窗口模式,以及使用它需要注意的一些点。另外有些 App 禁用了多窗口模式,但是依然有办法强制多窗口,我们一起来聊聊。
二、Android 的分屏模式
2.1 什么是多窗口模式
Android 从 N(7.0,API Level 24) 开始支持多窗口模式,或者叫分屏模式,即允许在屏幕上同时打开多个 App,同时显示多个窗口。
近几年的新手机,应该都是紧跟最新的系统,7.0 的发布也有好几年了,我想大家应该都可以享受到。
其实分屏模式使用起来很简单,在最近打开任务窗口(Overview Screen)中,可以长按 App,选择进入分屏模式。
2.2 分屏的生命周期
分屏模式支持同时打开 2 个 App 或者打开某个 App 的 2 个页面,当然这需要特殊的技巧,后面会说到。
说回到生命周期,当切换分屏模式时,如果不做任何处理,Activity 会触发销毁再重建,这个过程相信大家应该比较熟悉,毕竟切换个屏幕方向,Activity 默认都会销毁重建。
如果想禁用 Activity 销毁重建,则配置 android:configChanges 属性即可。
android:configChanges="screenLayout|screenSize|smallestScreenSize|orientation"
分屏模式还增加了一个系统回调 onMultiWindowModeChanged(isInMultiWindowMode) 方法,可以通过它的参数 isInMultiWindowMode 参数判断多屏模式的进入和退出。
除此之外,如果想要主动判断当前是否处于分屏模式,可以通过 Activity 或 Fragment 的 inMultiWindow() 进行判断。
2.3 打开分屏的页面
默认情况下,同一个 App 的多个 Activity 会共用同一个窗口,且无法分配到不同的窗口中。
所以我们在分屏模式下,打开某个页面,实际上还是在当前窗口中打开,如果想让新页面被分配到不同的窗口中,可以通过给 Intent 设置 FLAG_ACTIVITY_LAUNCH_ADJACENT 标识来实现。
当处于分屏模式下时,通过该 Flag,新 Activity 就会在新的栈中被启动,以此实现 2 个 Activity 被放置在不同的窗口中。
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
实际效果如下:
需要注意的是,该 Flag 随着 Android N 的支持,所以在使用时需要判断是否大于等于 Api Level 24。
另外我们也无需额外的判断是否处于分屏状态,如果当前不处于分屏状态,则该 Flag 的设置无效。
2.4 支持分屏
前面提到,分屏模式由 Android 7.0 引入。那么如果 targetSdkVersion 被设置为 N 及以上时,分屏是默认开启的,反之则是默认关闭。
分屏模式由 Application 的 android:resizeableActivity 属性控制,true 为开启,false 为关闭。我们可以通过这个属性,主动管理分屏模式。
这就把是否支持分屏模式的权限,交到了开发者手中,但是我作为一个使用者,我在分屏模式下,打开某个 App 时提示我不支持,其实是一个非常不好的体验。
例如今日头条,本身是不支持分屏模式的,当我们尝试以分屏模式打开它的时候,会以全屏模式打开 App,并且弹出一个 Toast 提示。
这种体验肯定是非常差劲的,那么我们有什么办法让 App 强制支持分屏模式呢?
这就需要借助「开发者模式」了,通过「开发者模式」下的 2 个开关,来强制让所有 App 都支持分屏模式,并且可以调整窗口大小。
需要注意的是,调整这 2 个开关,是需要重启后才会生效。同时这种强制的行为本身也是开发者预料之外的,所以如果出现一些小问题也是符合预期的。
当我们把 2 个开关打开后,所有的 App 都能够支持分屏模式,并且可以调整窗口大小。
三、小结时刻
分屏这个功能就说到这里,其实对于开发者来说,多数时候我们并不需要特殊设置什么,当 targetSdkVersion 为 24 的时候,其实已经默认支持。当然如果我们想要针对分屏模式做一些功能,也有对应的 Api 支持。
最后简单小结一下:
1. 分屏模式在 Android N 开始是默认打开的,通常不需要做什么也可以适配;
2. 可以通过 onMultiWindowModeChanged() 监听多窗口模式的切换,也可以通过 inMultiWindow() 主动判断当前是否是多窗口模式;
3. 如果不想支持分屏模式,可以通过 android:resizeableActivity 来控制;
4. 如果想要强制全部 App 支持分屏模式,可以在「开发者模式」中设置,让所有 App 都强制支持分屏模式;
【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】