1. 基础原理

1.1 ActivityRecord、TaskRecord、ActivityStack关系

一个ActivityRecord对应着一个Activity,而一个Activity可能对应着不同的ActivityRecord(因为Activity可能被实例化多次)。一系列的ActivityRecord存在于TaskRecord(一个Task就是用户体验上的一个“应用”,它将相关的Activity组合在一起,以ArrayList存储),而一系列TaskRecord存在于ActivityStack。ActivityStackSupervisor是用来管理这些ActivityStack的。

ActivityRecord对应Activity的三种类型:

static final int APPLICATION_ACTIVITY_TYPE = 0;//普通应用类型

static final int HOME_ACTIVITY_TYPE = 1;//桌面类型

static final int RECENTS_ACTIVITY_TYPE = 2;//最近任务类型

ActivityStack有五种静态栈:

0 HOME_STACK_ID //Home应用以及recents app所在的栈

1 FULLSCREEN_WORKSPACE_STACK_ID //一般应用所在的栈

2 FREEFORM_WORKSPACE_STACK_ID //类似桌面操作系统

3 DOCKED_STACK_ID //分屏的应用所在的栈

4 PINNED_STACK_ID //画中画栈

1.2 为什么要定义多个ActivityStack?

ActivityStack主要用于给TaskRecord的显示类型分类。

在Android系统中,无论是普通的Activity窗口,还是特殊的输入法窗口和壁纸窗口,它们都是被WindowManagerService服务组织在一个窗口堆栈中的,其中,Z轴位置较大的窗口排列在Z轴位置较小的窗口的上面。

通过ActivityStack中定义的栈类型,WMS可以方便的指定ActivityStack中各个Activity窗口显示的z轴位置。比如ActivityStack为DOCKED_STACK_ID的一系列Activity窗口就要显示在ActivityStack为FULLSCREEN_WORKSPACE_STACK_ID的所有Activity窗口之上。

1.3 Activity绘制

每一个Activity组件都有一个关联的Window对象(PhoneWindow),用来描述一个应用程序窗口。每一个应用程序窗口内部又包含有一个View对象(DecorView),用来描述应用程序窗口的视图。

控制Acivity的显示,就是通过PhoneWindow控制显示区域,通过DecorView控制显示样式和布局。

2. 原生分屏显示功能

2.1 Recents中的任务管理

Recents界面结构

任务列表界面中的每一个任务对应一个TaskView,TaskView通过一个对应的Task类存储Activity的包名类名等信息。

2.2 分屏操作流程

分屏操作流程

1,通过AMS将要分屏的TaskRecord放入DOCKED_STACK_ID所在的ActivityStack

2,计算分屏后窗口大小(首先以对半分的形式显示)

3,要分屏的TaskRecord中的Activity重新启动,并在WMS中根据新窗口大小进行绘制

4,将RecentActivity放入DOCKED_STACK_ID所在的ActivityStack并同样根据新窗口进行绘制,显示在另一半边

5,绘制分割线DividerView。拖动分割线会重新计算窗口大小,释放触摸后重绘窗口

另外,分屏显示流程中使用了EventBus进行消息传递。

2.3 EventBus

SystemUI的Recents相关代码,使用EventBus进行消息传递。大致原理是首先向EventBus注册回调,当通过EventBus传递消息时,会遍历注册的回调,通知所有符合的回调。

分屏主要使用了以下Event(基于android8.0源码):

DragEndEvent消息,将一个TaskView分屏;

LaunchTaskEvent消息,在任务列表中打开应用;

UndockingTaskEvent消息,分屏分割线的拖动消息

3. SF的生产者消费者模型

SF的Client对象创建了一个图元生产者,并且赋值给SurfaceControl中,SurfaceControl生产Surface对象。

Surface通过Binder和BufferQueue通信,申请buffer,往这个buffer中填入想要显示的内容,再塞回BufferQueue,BufferQueue会通知SuefaceFlinger进行渲染显示。

4.开机自动分屏的简单实现

基本思想就是查找目标Activity的TaskView和Task,使用DragEndEvent消息模拟TaskView的拖动进行分屏,然后通过LaunchTaskEvent消息在另一个分屏区域打开目标应用。还可以通过自定义Event模拟分屏分割线的拖动,实现分屏比例修改。

参考:

android分屏模式_Android分屏显示总结相关推荐

  1. android分屏模式_Android分屏模式开发注意事项

    Android分屏模式开发注意到主页面在分屏模式下,页面所占比例在增大或者减小的时候都会调用oncreat方法,所以查资料总结一下分屏对页面的生命周期的影响以及开发时的注意事项: App页面从全屏模式 ...

  2. android分屏模式_Android多窗口模式(分屏模式)

    Android N 支持多窗口模式,或者叫分屏模式,即在屏幕上可以同时显示多个窗口. 在手机模式下,两个应用可以并排或者上下同时显示,如图 1 所示,屏幕上半部分的窗口是系统的 CLOCK 应用,下半 ...

  3. Android多窗口模式(分屏模式)

    Android N 支持多窗口模式,或者叫分屏模式,即在屏幕上可以同时显示多个窗口. 在手机模式下,两个应用可以并排或者上下同时显示,如图 1 所示,屏幕上半部分的窗口是系统的 CLOCK 应用,下半 ...

  4. android分屏模式_Android的分屏模式开发注意事项

    android7.0 的API开始有了分屏功能,在测试时注意到主页面在分屏模式下,页面所占比例在增大或者减小的时候都会调用oncreat方法,所以查资料总结一下分屏对页面的生命周期的影响以及开发时的注 ...

  5. android 图片横竖判断_Android横竖屏切换及其对应布局加载问题详解

    本文为大家分享了Android横竖屏切换及其对应布局加载问题,供大家参考,具体内容如下 第一,横竖屏切换连带横竖屏布局问题: 如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同 ...

  6. android 截屏函数_android截屏功能实现代码

    这篇文章主要为大家详细介绍了android截屏功能的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 android开发中通过View的getDrawingCache方法可以达到截屏的目的, ...

  7. android新架构模式_Android MVIReact架构模式

    android新架构模式 If you are already aware of basic principles of architecture patterns and MVVM and MVI ...

  8. android系统息屏设置_Android亮屏和熄屏控制

    一. 前言 我们的Android应用程序很多需要和亮屏和熄屏打交道,比如闹钟的时候,需要保持亮屏,之后又需要熄屏.那么今天,我们来分析下这方面的功能. 二. 系统服务 --- PowerManager ...

  9. android系统息屏设置_Android亮屏和熄屏控制实例详解

    本文实例讲述了Android亮屏和熄屏控制实现方法.分享给大家供大家参考,具体如下: 一.概述 我们的Android应用程序很多需要和亮屏和熄屏打交道,比如闹钟的时候,需要保持亮屏,之后又需要熄屏.那 ...

最新文章

  1. web安全简介_Web安全:HTTP简介
  2. asp.net弹出div层,并把弹出层上的值赋值给界面
  3. 网站SEO更新时选择适当的时间点有什么好处?
  4. java科学计数字符串显示
  5. 基于IOC的GUI框架设计与实现
  6. 机房为什么要设计冷热通道,设计原则及如何施工?
  7. Oracle取最大/最小值函数
  8. django1.4.9 OMserverweb站点管理
  9. java 二维高斯_Java Random nextGaussian()用法及代码示例
  10. 剖析:3D游戏建模的千奇百变,带你快速入门
  11. linux pivot root,[mydocker]---通过例子理解chroot 和 pivot_root
  12. Linux学习笔记---使用MfgTool工具烧写自己的系统(二)
  13. 论文笔记_S2D.61_2019-CVPR-DeepLiDAR:基于稀疏激光雷达数据和单张彩色图像的户外场景的表面法线引导的深度预测
  14. 资源 | NJUPT-Yellow-Page 南邮黄页
  15. Android:手机号码归属地查询
  16. 时序数据库QuestDB和TimescaleDB对比
  17. 基于STM32的MLX90614(GY-906)人体红外测温
  18. (2020年下半年软件设计师49题)程序设计语言的大多数语法现象可以用CFG(上下文无关文法)表示。下面的CFG产生式集用于描述简单算术表达式,其中+ - * 表示加、减、乘运算,id表示单个字母表示
  19. Java实现局域网聊天软件分享
  20. Python3.8场景式编程学习与训练- 第1章 入门基础 Python学习方法论与学习资源

热门文章

  1. Python进制转换与ASCII转换
  2. IIS发布问题:HTTP错误404.17和404.2
  3. 95前的中年人,00后的「社交玩法」了解一下?
  4. python脚本编程:批量压缩图片大小
  5. 【2020年高被引学者】 孙剑 旷视科技
  6. DNS加速之“智能DNS”跟“双线加速”、“CDN加速”的区别
  7. [BJDCTF2020]Mark loves cat 1——(超详细 三种方法)
  8. 融会贯通面对对象编程思想
  9. 对ABAP程序调优的学习(一)select 改 read table
  10. 西游记中唐僧师徒的不同性格