Android实现一键开启自由窗口、分屏、画中画模式——自由窗口模式

Android实现一键开启自由窗口、分屏、画中画模式——自由窗口模式,第1张

转载请注明出处:https://blog.csdn.net/sunmmer123

忙过一段时间后,新需求又来了“多个应用/页面间在不用退出或者切换的情况下,可同时 *** 作”
咋一听是不是很迷惑,简单来说“此时你在爱奇艺刷着剧,不退出爱奇艺的情况下,照常能在微信聊着天”
这不是妥妥的时间管理大师嘛,众所周知,生活中我们也都是直接切到对应App中去,没有说同时不退出的情况下 *** 作第二个App。

那么这种“高大上的”需求功能能实现么?
其实早在2016年5月19日, Google I/O 开发者大会中发布的Android N(7.0)新功能“多窗口模式”,就已经解决了这种一边刷剧一边聊天一边打游戏的需求了。

市面上大多数Android手机进入多窗口模式的入口.多任务下,长按对应应用页面,会出现按钮,点击进入。
“今天我们自己做一个入口,开启自由窗口模式,同时应用内的页面也可分屏互不影响 *** 作。”


1、多窗口模式概念

看了大致的一个功能效果后,我们要了解一下多窗口模式的概念:多窗口模式就是指可以同时显示多个应用
Android 支持三种多窗口模式配置:

自由窗口:允许用户动态调整应用窗格大小,并在屏幕上显示两个以上的应用,这种模式类似于我们常见的桌面 *** 作系统分屏:是默认的多窗口模式实现,可为用户提供两个 Activity 窗格来放置应用。画中画 (PIP) :允许 Android 设备在用户与其他应用互动时在小窗口中播放视频内容。

详细的知识学习参考:Android 开源项目

2、要点分析

在了解学了原理性的知识点后,实现这些功能,其实都很简单,毕竟都是调用系统的API
这个demo的功能要点,我分为以下几点:

如何实现打开自由窗口模式如何实现一键开启分屏模式如何实现画中画模式

围绕这三点,我分三篇博文和大家一起交流学习下

一键开启进入自由窗口模式一键开启进入分屏模式一键进入画中画模式

自由窗口模式

自由窗口模式专业术语:freeform模式,它类似于Windows的窗口模式。进入了freeform模式后,窗口的顶部多两个 *** 作按钮,表示放大当前窗口,相当于是“”全屏”,关掉当前的窗口。
先看效果:进入freeform模式后,俩个不同应用,无需退出第一个应用,直接打开第二个

1、如何实现打开自由窗口模式

google 默认freeform是关闭的,如果要测试需要手动开启。
打开的方式有俩种,我用的是第二种

通过system feature定义:
查看AOSP已经定义的Feature配置文件:frameworks/native/data/etc/android.software.freeform_window_management.xml,只需要把此文件push到手机的system/etc/permissions/目录下,开机时PMS会通过的读取此目录下xml配置开启freeform这个feature。

增加开关通过Settings启动:
adb shell settings put global enable_freeform_support 1

注意:
1、有的手机通过以上Settings的方式启动不了,可以增加一句开启命令:

adb shell settings put global force_resizable_activities 1


2、开启后一定需要重启,功能才会生效
3、重启后,查看下多窗口模式是否正常开起来了( 其实就是通过开启put时的字段,在获取的时候get一下)

2、以自由窗口模式启动Activity

freeform模式打开后,我们如何以该模式打开应用。这里会涉及俩个关键知识点。
1、栈:

Android为了支持多窗口,在运行时创建了多个Stack。启动一个Activity之后,必定会将此Activity存放于某一个Stack。
在Android N中,系统定义了5种Stack ID,每个Stack会有一个唯一的ID。简单可以理解为Stack就是类似虚拟桌面的作用。

2、ActivityOptions:

系统根据ActivityOptions来控制启动的Task的栈边界的大小

掌握以上知识点后,看下开启代码:

3、如何以自由窗口模式启动系统所有应用

freefrom模式开启后,想要设备系统中的所有应用点击打开,都是以自由窗口模式打开的怎么做?

其实原理和打开Activity的都一样,都是通过ActivityOptions进行反射设置一下Stack ID系统所有应用也就是包含那些系统应用,所以只要在framework拦截启动APP的入口,以自由窗口模式启动就可以。
看下framework层启动代码:frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ,在红框圈出来的地方,增加这俩句代码

以上,关于自由窗口的知识点就介绍完了
关于更加细节的freeform模式学习,可以看看这篇博客:android freeform模式定制桌面系统
Android源码系统源码下载路径:https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks

小补充点: 自由窗口模式里面,窗口支持放大缩小以及移动位置,原理是不断的更改Task的边界(用Rect表示),然后根据Task的边界来重新缩放Task,从而达到窗口缩放和拖动的作用。


接下去,可以继续学习多窗口模式中的 分屏模式和 画中画模式

一键开启进入分屏模式一键进入画中画模式

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存