欢迎来到天天文库
浏览记录
ID:37915408
大小:401.00 KB
页数:40页
时间:2019-06-02
《Android窗口管理服务WindowManagerService显示Activity组件启动窗口(Starting Window)过程分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(StartingWindow)的过程分析在Android系统中,Activity组件在启动之后,并且在它的窗口显示出来之前,可以显示一个启动窗口。这个启动窗口可以看作是Activity组件的预览窗口,是由WindowManagerService服务统一管理的,即由WindowManagerService服务负责启动与结束。在本文中,我们就详细分析WindowManagerService服务启动与结束Activity组件的启动窗口的过程。Activity组件的启动窗口是由Activity
2、ManagerService服务来决定是否要显示的。如果需要显示,那么ActivityManagerService服务就会通知WindowManagerService服务来为正在启动的Activity组件显示一个启动窗口,而WindowManagerService服务又是通过窗口管理策略类PhoneWindowManager来创建这个启动窗口的。这个过程如图1所示。窗口管理策略类PhoneWindowManager创建完成Activity组件的启动窗口之后,就会请求WindowManagerService服务将该启动窗口显示出来。当Activity组件启动完成,并且它的窗口也显示出来的
3、时候,WindowManagerService服务就会结束显示它的启动窗口。注意,Activity组件的启动窗口是由ActivityManagerService服务来控制是否显示的,也就是说,Android应用程序是无法决定是否要要Activity组件显示启动窗口的。接下来,我们就分别分析Activity组件的启动窗口的显示与结束过程。一.Activity组件的启动窗口的显示过程从前面一文可以知道,Activity组件在启动的过程中,会调用ActivityStack类的成员函数startActivityLocked。注意,在调用ActivityStack类的成员函数startActiv
4、ityLocked的时候,Actvitiy组件还处于启动的过程,即它的窗口尚未显示出来,不过这时候ActivityManagerService服务会检查是否需要为正在启动的Activity组件显示一个启动窗口。如果需要的话,那么ActivityManagerService服务就会请求WindowManagerService服务为正在启动的Activity组件设置一个启动窗口。这个过程如图2所示。这个过程可以分为6个步骤,接下来我们就详细分析每一个步骤。Step1.ActivityStack.startActivityLocked[java]viewplaincopy在CODE上查看代码
5、片派生到我的代码片publicclassActivityStack{......//Settofalsetodisablethepreviewthatisshownwhileanewactivity//isbeingstarted.staticfinalbooleanSHOW_APP_STARTING_PREVIEW=true;......privatefinalvoidstartActivityLocked(ActivityRecordr,booleannewTask,booleandoResume){finalintNH=mHistory.size();......intaddPo
6、s=-1;......//Placeanewactivityattopofstack,soitisnexttointeract//withtheuser.if(addPos<0){addPos=NH;}......//SlottheactivityintothehistorystackandproceedmHistory.add(addPos,r);......if(NH>0){//Wewanttoshowthestartingpreviewwindowifweare//switchingtoanewtask,orthenextactivity'sprocessis//notcurre
7、ntlyrunning.booleanshowStartingIcon=newTask;ProcessRecordproc=r.app;if(proc==null){proc=mService.mProcessNames.get(r.processName,r.info.applicationInfo.uid);}if(proc==null
8、
9、proc.thread==null){showStartingIcon=true;}......mSe
此文档下载收益归作者所有