转载请注明出处: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,从而达到窗口缩放和拖动的作用。


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

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

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

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

    转载请注明出处:https://blog.csdn.net/sunmmer123 Android实现一键开启自由窗口.分屏.画中画模式系列 一键开启进入自由窗口模式 一键开启进入分屏模式 一键进入画中 ...

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

    转载请注明出处:https://blog.csdn.net/sunmmer123 Android实现一键开启自由窗口.分屏.画中画模式系列 一键开启自由窗口模式 一键开启进入分屏模式 一键开启画中画模 ...

  3. android分屏模式_浅谈 Android 7.0 多窗口分屏模式的实现

    从 Android 7.0 开始,Google 推出了一个名为"多窗口模式"的新功能,也就是我们常说的"分屏模式".那么,这个功能有什么用呢?作为开发者,我们又 ...

  4. Android多窗口分屏(原生方法)

    事实上KitKat已经可以实现多窗口分屏,只是功能不全,Google并没有把这个功能提供给用户. 使用am stack boxes可以查看当前系统存在的Activity Stack: 1 am sta ...

  5. ubuntu分屏软件_Ubuntu终端多窗口分屏Terminator

    1.安装 Terminator最大的特点就是可以在一个窗口中打开多个终端 sudo apt-get install terminator 2.快捷键 Ctrl+Shift+E    垂直分割窗口 Ct ...

  6. 三星s20计算机怎么添加到桌面,三星s20+怎么分屏?三星s20系列多窗口分屏设置操作步骤...

    三星s20+怎么分屏?三星s20系列多窗口分屏设置操作步骤来讲一讲吧,三星S20是一款屏幕体验超好的智能手机,它可以运行多窗口,让我们在分屏视图上同时运行两个应用程序.比如我们能一边聊天,一边看视频, ...

  7. excel多窗口分屏并列显示

    excel多窗口分屏显示 浏览:183 | 更新:2014-07-30 17:35 | 标签: excel 1 2 3 4 分步阅读 与WORD可以同时打开多个编辑窗口不同,在编辑excel时通常只能 ...

  8. 显示器窗口分屏双显示器电脑安装指南

    显示器窗口分屏&双显示器电脑安装指南 windows单显示器窗口分屏 快捷键 多显示器分屏连接 设备检查 连接线选择 windows10系统分屏 传统办公单位(如:教师.公务员等)以及一般家庭 ...

  9. MFC Windows 程序设计[六十]之窗口分屏(附源码)

    MFC Windows 程序设计[六十]之窗口分屏 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 MFC是微软公司提供的一个类库(class libraries),以C+ ...

  10. windows 窗口分屏快捷键

    Windows 窗口分屏快捷键是: Windows + Left Arrow 键: 窗口移到屏幕左侧. Windows + Right Arrow 键: 窗口移到屏幕右侧. Windows + Up ...

最新文章

  1. 苹果手机数据转移到新手机_买了新手机,数据迁移用它轻松搞定
  2. HTML实现跳转到页面指定位置
  3. C#多线程编程系列(五)- 使用任务并行库
  4. .idea文件夹是做什么的_33 个 IDEA 最牛配置,写代码太爽了!
  5. Ubuntu MySQL 重新安装
  6. golang string转int8_golang一般常用数据类型转换总结
  7. 声纹识别的模式识别方法
  8. ACL'21 | 对比学习论文一句话总结
  9. iOS开发网络篇—GET请求和POST请求(转)
  10. Centos7 下安装tomcat7
  11. Python3爬虫韩寒新浪博客文章
  12. linux版的微博客户端,推荐Ubuntu Linux下的新浪微博客户端
  13. JavaScript 数组(二)数组练习
  14. CDD数据库文件制作(三)——DID
  15. 笔记本 win10设置wifi热点
  16. Android Settings 中wifi详情页 隐私默认选中设备mac
  17. xampp mysql 卸载_XAMPP怎么卸载
  18. 2020年VR全景加盟的行业趋势
  19. 快速幂 优化快速幂 算法宝典 中等
  20. 小程序+单页+需要服务器,小程序单页设计

热门文章

  1. 详解:什么是NVMe?
  2. js获取某一天是星期几
  3. iOS TouchID验证和Keychain结合使用
  4. echarts绘制地理坐标/地图
  5. [转载] 晓说——第14期:揭秘战争秘闻 朝鲜战争62年祭(上)
  6. 九宫格切图器(每天一个python小项目)
  7. 计算机网络(七)——互联网上的音频/视频服务 和 无线网络与移动网络
  8. 大数据需要学习什么?
  9. 信号完整性可能遇见的五类问题
  10. github首次使用提交项目