欢迎来到天天文库
浏览记录
ID:37909511
大小:274.50 KB
页数:36页
时间:2019-06-02
《Android窗口管理服务WindowManagerService切换Activity窗口(App Transition)过程分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Android窗口管理服务WindowManagerService切换Activity窗口(AppTransition)的过程分析在Android系统中,同一时刻只有一个Activity组件是处于激活状态的,因此,当ActivityManagerService服务激活了一个新的Activity组件时,它就需要通知WindowManagerService服务将该Activity组件的窗口显示出来,这会涉及到将焦点与屏幕等资源从前一个激活的Activity组件切换到后一个激活的Activity组件的过程,
2、本文就详细分析这个过程。Activity窗口的切换操作是在新激活的Activity组件的启动过程进行的。具体来说,就是在前一个激活的Activity组件进入到Paused状态并且新激活的Activity组件进之到Resumed状态之后,将前一个激活的Activity组件的窗口设置为不可见,以及将新激活的Activity组件的窗口设置为可见。整个切换过程是需要在ActivityManagerService服务与WindowManagerService服务的协作之下进行的,如图1所示。WindowMana
3、gerService服务在执行Activity窗口的切换操作的时候,会给参与切换操作的Activity组件的设置一个动画,以便可以向用户展现一个Activity组件切换效果,从而提高用户体验。事实上,一个Activity窗口在由不可见状态切换到可见状态的过程中,除了会被设置一个Activity组件切换动画之外,还有被设置一个窗口进入动画,此外,如果该Activity窗口是附加在另外一个窗口之上的,并且这个被附加的窗口正在显示一个动画,那么这个动画也同时会被设置给到该Activity窗口的显示过程中去。
4、本文主要是关注Activity窗口的切换操作,在接下来的一篇文章中分析窗口的动画框架时,我们再详细分析上述三种动画是如何作用在窗口的显示过程中的。从前面一文可以知道,ActivityManagerService服务在启动一个Activity组件的过程中,会调用到ActivityStack类的成员函数startActivityLocked。ActivityStack类的成员函数startActivityLocked首先会给正在启动的Activity组件准备一个切换操作,接着再调用其它的成员函数来通知前一
5、个激活的Activity组件进入到Paused状态。等到前一个激活的Activity组件进入到Paused状态之后,ActivityManagerService服务就会检查用来运行正在启动的Activity组件的进程启动起来了没有。如果这个进程还没有启动,那么ActivityManagerService服务就会将该进程启动起来,然后再调用ActivityStack类的成员函数realStartActivityLocked来将正在启动的Activity组件加载起来,并且将它的状态设置为Resumed,最
6、后通知WindowManagerService服务执行前面所准备的切换操作。接下来,我们就从ActivityStack类的成员函数startActivityLocked开始分析Activity窗口的切换过程,如图2所示。这个过程可以分为9个步骤,接下来我们就详细分析每一个步骤。Step1.ActivityStack.startActivityLocked[java]viewplaincopy在CODE上查看代码片派生到我的代码片publicclassActivityStack{......privat
7、efinalvoidstartActivityLocked(ActivityRecordr,booleannewTask,booleandoResume){finalintNH=mHistory.size();intaddPos=-1;if(!newTask){//Ifstartinginanexistingtask,findwherethatis.........}//Placeanewactivityattopofstack,soitisnexttointeract//withtheuser.if
8、(addPos<0){addPos=NH;}......//SlottheactivityintothehistorystackandproceedmHistory.add(addPos,r);......if(NH>0){......if((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION)!=0){mService.mWindowManager.prepareAppTransition(Win
此文档下载收益归作者所有