窗口切换逻辑设计中需要解决的问题

  Android中的窗口管理系统中,首先在AmS中保存所有与Activity 相关的信息,在Activity启动和关闭时,AmS会通知WmS同步Activity窗口的状态,而在WmS中使用WindowState类保存一个窗 口的信息,这些窗口信息需要根据Activity的状态而动态改变。在WmS中另外有一个InputManager对象,该对象内部保存了输入消息处理时 所需要的窗口信息,借助这些信息,InputDispatcher能够决定输入消息应该对应哪个窗口,WindowState类的信息必须与 InputManager内部的窗口信息也保持同步。

  切换过程中要解决的问题可归纳为三类,第一类是状态同步问题,即AmS如何把状态 传递给WmS,WmS如何保存这些状态,又如何把这些状态传递给InputManager;第二类问题是屏幕绘制问题,即当AmS启动或者关闭一个 Activity时,用户一般会看到一个动画,那么WmS如何定义这个动画,并如何在动画绘制前先隐藏目标窗口,直到动画结束后才显示目标窗口,而要实现 这种动画的绘制就需要一种特别的变量来保存动画窗口和目标窗口的关系;第三类问题是消息处理问题,即在窗口切换的过程中,是老窗口应该继续捕获用户消息呢 还是新窗口?

  首先来看状态同步问题

  在AmS中使用ActivityRecord类来保存一个 Activity相关的信息,ActivityRecord类本身是一个Binder类,名称为IApplicationToken.Stub。每个 ActivityRecord都会在WmS中对应一个AppWindowToken类,该类保存了和ActivityRecord相关的所有窗口信息,比 如启动窗口、实际窗口、关闭窗口等。当启动一个新的Activity时,AmS中会先创建一个ActivityRecord对象,并请求WmS中也创建一 个AppWindowToken对象;当销毁一个Activity时,AmS会请求WmS删除AppWindowToken对象。

  AppWindowToken中包含的窗口对象在WmS中的mWindows等列表变量中也都有记录,当新窗口启动时,必须保证这些列表中的对象和AppWindowToken中保存的窗口信息之间的同步。

  WmS中有一个InputManager对象mInputManager,该对象中保存了输入消息处理所需的窗口信息,当有新窗口添加或者旧窗口被删除时,该对象中的窗口信息同时需要被更新。

   下面再来看绘制问题。当新建一个窗口时,AmS会首先判断该窗口是同一个Task中的Activity还是一个新的Task。如果是同一个Task,则 会指定一个Activity切换效果的动画,而如果是一个新的Task,则会指定一个Task切换的动画效果,这些动画效果的实施都是在WmS中完成的。 每一个动画实际上都仅仅是一个窗口而已,动画的过程可以简单地理解为对同一个窗口进行不同的变化,并在连续的时间将其显示出来,从而形成动画。

   而在动画的过程中,如果目标窗口也已经创建好,则在动画结束之前不能显示目标窗口,只有当动画结束后才能显示目标窗口;而如果在动画结束后目标窗口还没 有被创建,则启动窗口不消失,直到目标窗口被创建好才消失。这个逻辑的具体实现是在 performLayoutAndPlaceSurfaceLocked()函数中完成的,当然该函数可能仅仅是个包装,内部又会调用 performLayoutAndPlaceSurfaceLockedInner()函数。为了叙述的方便,本节以后将这两个函数统称为 traversal,因为它们的功能就是根据所有窗口的状态参数,调整其在屏幕上的显示效果,有点类似于ViewRoot类中的 performTravasals()函数。

  最后再来看消息处理问题。当要添加一个新窗口时,如果该窗口需要启动动画,那么在动画结束 前,应该是哪个窗口获得输入消息呢?在WmS中提供了诸如startAppFreezingScreen()、 topAppFreezingScreen()、resumeKeyDispatching()、pauseKeyDispatching()、 setEventDispatch(true/false)这样的接口,用于暂停、恢复消息处理,这些函数将影响在动画过程前后的输入消息处理。那么这些 API接口具体是被如何使用的?

Android内核开发必备知识相关推荐

  1. 移动端webapp开发必备知识

    转载自:移动终端开发必备知识 转载自:移动端webapp开发必备知识 请尊重版权,转载请注明来源,多谢~~ 移动设备的用户越来越多,每天android手机的激活量都已经超过130万台,所以我们面向移动 ...

  2. 移动终端开发必备知识(转载)

    移动设备的用户越来越多,每天android手机的激活量都已经超过130万台,所以我们面向移动终端的WebAPP也开始跟进了.本文主要介绍webapp的开发与调试的相关知识和经验,以及给出几种可选的解决 ...

  3. Android内核开发:系统启动速度优化

    在学习新知识的过程中,我一直很推荐结合实战任务去学习,只有经历实战,才能加深对理论知识的理解.<Android内核开发>系列已经写了八篇了,本文就结合前面的内容,给大家布置一个实战任务:  ...

  4. Android内核开发:图解Android系统的启动过程

    本文是<Android内核开发>系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载.版本和分支介绍.编译和烧写等等,从本文起就要开始 ...

  5. 移动端H5网页开发必备知识

    简介 工欲善其事必先利其器,今天这篇文章主要讲解移动端H5开发必备的一些基础知识以及移动端适配和布局方案.如果已经看过这篇文章了或者已经掌握了移动端基础的话可以看笔者写的 移动端H5网页开发常见问题汇 ...

  6. 移动端开发必备知识-Hybrid App

    简介 面试的时候小伙伴们有没有被问到过Hybrid App呢?不得不说了解Hybrid App是我们前端面试中的一个加分项.今天就跟随笔者的步伐让你彻底弄懂Hybrid App,让你就算没做过也能对面 ...

  7. STM32开发必备知识篇:STM32中断类型

    从今年2022年开通CSDN博客,已经快300天了,期间写了很多FPGA方面的博客,主要有两个专栏:"FPGA基础知识"和"FPGA 20个例程". 有同学也私 ...

  8. Android屏幕适配-必备知识

    Android屏幕适配专题 Android屏幕适配-必备知识 Android屏幕适配-终结者 你是否被屏幕的各种参数(dpi.ppi等)搞的头晕眼花? 屏幕的密度到底是怎么回事? 应该如何来进行屏幕适 ...

  9. Android内核开发:源码的版本与分支详解

    我想很多初学者或许跟我一样,看完Android源码下载相关的文章以后,就开始兴致勃勃地去下载Android源码了,但是下载完了源码后,有没有像我一样产生如下几个困惑呢? (1) Android版本有哪 ...

最新文章

  1. Jenkins +maven+tomcat自动构建部署(学习笔记三十六)
  2. C# typeof Gettype is as 拆箱 装箱
  3. 获取本机主机名称和IP地址
  4. 对口单招考试能用计算机吗,对口单招计算机能考试标准.doc
  5. IT人士运动方式选择建议
  6. android源码编译烧鸡,android4.0源码下载 编译 系统体验~图解
  7. linux 批量部署 pdf,Linux服务之批量部署篇
  8. yml eureka defaultzone 只生效第一个_SpringCloud基础教程(三)-Eureka进阶
  9. OpenHub框架–下一个有趣的功能
  10. c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)
  11. Python编程,日志聚合工具,开源经济学,Prometheus监控,Kubernetes等
  12. 介绍ML.NET——面向.NET开发人员的机器学习库
  13. 福师《计算机应用基础》期末考试a卷数据是,2020年春福师《计算机应用基础》期末考试A卷附答案...
  14. 【设计模式学习笔记】之 开山篇
  15. Oracle DBHelper 第二版
  16. Anybody = Nobody
  17. AWVS扫描器使用入门
  18. ACM中关于Output Limit Exceeded和Time Limit Exceeded
  19. 瓴羊DAAS闪耀云栖大会,发布数字化时代最优解
  20. Trap命令使用说明

热门文章

  1. springdatajpa命名规则_简单了解下spring data jpa
  2. unity android本地推送,Unity安卓本地推送
  3. Java运行作业控制语言_Java安全——语言本身的设计
  4. windows 命令行cmd安装python matplotlib模块后pycharm显示“ModuleNotFoundError: No module named ‘matplotlib‘解决方法
  5. 对指针变量取地址_C语言指针简介(amp;和*运算符)
  6. HALCON打开之后相机无法被别的程序找到解决方法
  7. sublime text3 怎么配置、运行python_怎么用sublime text 3搭建python 的ide?
  8. folders默认配置 shell_分布式存储Ceph RBD-Mirror灾备方案(二)镜像模式配置
  9. 作业(二)—python实现wc命令
  10. 我和奇葩的故事之失联第七天