不瞒大家,我在湖北的这 2 个月,体验了 Android 的这个功能,真香!

企业动态
在家远程办公的这段时间,除了正常的工作学习之外,精神娱乐也少不了,肉身和空间上的限制,也无法阻碍对精神世界的追求。但无论怎么玩出了花样,多数时候还是脱离不了手机这个小小的屏幕。

 ​[[320308]]

一、序

大家好,我是承香墨影。不瞒大家说,我已经在湖北待了 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专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】

​戳这里,看该作者更多好文​

 

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2020-05-19 21:06:17

任正非华为员工

2019-05-30 06:37:38

网络故障网络协议网络

2013-07-17 09:13:19

2022-03-22 09:20:57

应用线程池技术

2021-08-09 08:24:08

时间工作生活

2022-05-27 12:20:18

微信智能手机

2022-07-29 14:11:51

前端浏览器

2024-10-29 15:29:06

2009-04-28 18:59:56

LinuxWindows体验

2021-12-15 06:18:23

iOS15.2苹果 iOS

2019-07-15 09:21:45

技术思维阿里

2019-07-09 16:00:18

阿里数据库技术思维

2021-09-30 18:22:46

VSCode插件API

2021-12-02 06:34:34

GraylogELK日志

2017-11-09 14:40:49

悬浮Tab代码

2021-12-03 10:46:49

ELKGraylog运维

2021-01-03 16:42:52

Windows 10Windows操作系统

2019-03-15 15:06:08

华为生态伙伴大会智慧岛

2024-09-25 16:05:56

2020-04-09 08:29:50

编程语言事件驱动
点赞
收藏

51CTO技术栈公众号