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

转载请注明出处: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模式后,俩个不同应用,无需退出第一个应用,直接打开第二个
《Android实现一键开启自由窗口、分屏、画中画模式——自由窗口模式》

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
    《Android实现一键开启自由窗口、分屏、画中画模式——自由窗口模式》

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

    • adb shell settings put global force_resizable_activities 1

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

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

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

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

2、ActivityOptions:

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

掌握以上知识点后,看下开启代码:
《Android实现一键开启自由窗口、分屏、画中画模式——自由窗口模式》
《Android实现一键开启自由窗口、分屏、画中画模式——自由窗口模式》

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

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

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

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

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

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

    原文作者:W_D_T
    原文地址: https://blog.csdn.net/sunmmer123/article/details/118211623
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞