窗口切换逻辑设计中需要解决的问题
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接口具体是被如何使用的?
分享到:
相关推荐
8. **源码阅读与编译**:了解如何获取Android源码、配置编译环境,以及如何编译和定制Android内核,是深入学习的必备技能。 通过阅读《Android内核剖析》,读者可以全面掌握Android内核的工作原理,从而在实际开发...
通过这个“Android开发必备教程”,你可以系统地学习Android开发的基础和高级概念,逐步成为一名合格的Android开发者。记得实践是检验真理的唯一标准,理论学习后一定要动手实践,不断优化和改进你的应用。
包括android软件逆向分析和系统安全方面的必备知识及概念、如何静态分析android 软件、如何动态调试android 软件、android 软件的破解与反破解技术的探讨,以及对典型android 病毒的全面剖析。 《android软件安全...
3. **linux Android基础知识总结.pdf**:这份资料可能讲解了Android操作系统与Linux内核的关系,包括Android对Linux内核的定制、驱动程序开发、系统启动流程等方面,对理解Android系统的底层运作至关重要。...
### Android开发必备资料之50例源码 在Android开发领域,掌握丰富的源代码实例能够极大地提升开发者的技能水平,并帮助他们快速理解复杂的概念和技术细节。以下是对“Android开发必备资料之50例源码”中提及的部分...
本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入...
Android系统基于Linux内核,其应用程序框架层支持Java API,开发者通常使用Java或Kotlin进行开发。Android应用由一系列组件构成,如Activity(活动)、Service(服务)、BroadcastReceiver(广播接收者)、...
包括android软件逆向分析和系统安全方面的必备知识及概念、如何静态分析android 软件、如何动态调试android 软件、android 软件的破解与反破解技术的探讨,以及对典型android 病毒的全面剖析。 《android软件安全...
《Android应用开发详解》是郭宏志先生撰写的一本深入探讨Android应用开发的书籍,它为读者提供了全面、详实的Android开发知识。通过这本书,开发者可以了解到Android平台的架构、核心组件以及如何构建功能丰富的应用...
Linux内核提供了丰富的驱动模型,如字符设备、块设备、网络设备等,Android驱动开发主要基于这些模型进行定制和扩展。了解内核模块的编译、加载和调试技巧是必备技能,这包括Kconfig和Makefile的理解,以及使用kgdb...
《Android开发艺术探索》是一本深受Android开发者喜爱的著作,旨在深入探讨Android应用程序开发的各种技术和艺术。这本书由尹成编写,全面覆盖了Android开发的各个方面,包括基础、进阶和实战技巧,帮助开发者提升...
《Android应用开发详解与代码(清晰版)》是一本针对初学者精心编写的指南,旨在帮助读者快速掌握Android应用开发的基础知识。这本书以其清晰的PDF格式,为学习者提供了优质的阅读体验,避免了模糊不清的图像或文字...
- **Linux和Shell脚本的基本知识**:因为Android系统基于Linux内核,所以在进行游戏开发时,了解Linux操作系统的基础知识以及Shell脚本编写技巧是十分必要的。 ##### 1.2 需要哪些软件工具 - **Android Studio**:...
本书主要聚焦于Android系统的底层开发,涵盖了Android系统架构、内核移植、驱动程序开发、性能优化等多个关键领域,旨在帮助读者提升在Android平台上的系统级编程能力。 1. **Android系统架构**:Android系统由多个...
这份“Android系统概述——底层开发的资料”可能涵盖了上述各个方面的知识,包括源码分析、驱动开发、系统优化等内容,旨在帮助开发者深入理解Android系统并进行有效的底层开发。通过学习和实践,你可以掌握Android...
《Android开发教程CHM》是一本专为Android开发者...无论你是刚开始接触Android开发,还是寻求进阶知识,这个资源都能提供宝贵的学习材料。通过深入学习和实践,你将能够熟练掌握Android开发,创造出高质量的应用程序。