1、recentApps 处理流程recentApps处理流程目录RecentAPP显示流程 1task的获取 3RecentTasks赋值 4缩略图获取 7近期任务显示 9RecentAPP删除流程 10总结 12RecentAPP显示流程近期任务中很重要的一部分是StatusBarManagerService, Recentapp的显示主要是通过其调起。那我们就先分析下StatusBarManagerService,在系统初始化的时候我们获取了StatusBarManagerService,然后把它加入到了ServiceManager中,其中以Context.STATUS_BAR_SERVIE
2、R为标志,为方便了后面的获取。SystemServer.java -main() - run()接着就是对StatusBarManagerService的分析了,StatusBarManagerService extends IStatusBarService.Stub 就是一个IBinder对象,它通过ServiceManager.addService()的方式启动。LocalServices是进程内调用的服务,那么StatusBarManagerInternal也就是在system_process进程中使用。当用户长按HOME键的时候,PhoneWindowManager的intercep
3、tKeyBeforeDispatching()函数会对HOME按键进行处理,执行调起recentAPP应用。从下面的截图我们可以看到,phonewindowManager是通过StatusBarManagerInternal来最终调用到StatusBarManagerService的toggleRecentApps函数,接着进而调用到IStatusBar子类CommandQueue的接口实现类 BaseStatusBar中。然后最终调起RecentsTvActivity显示出近期任务。下面是recentAPP调起过程中所涉及的类图(图一)图一从interceptKeyBeforeDispatc
4、hing开始到近期任务显示出来,分两部分工作。一是task的获取,二是task的显示。Task的获取主要是preloadRecentApps()来完成;task获取后近期任务的显示是由toggleRecentApps()来完成。下面我们将分别讲讲这两个流程:task的获取从下面的Task获取流程(图二)中可以看到,在ams中,有一个mRecentTasks对象,该对象保存了近期启动的task任务信息,RecentsActivity实际上是要获取mRecentTasks对象,而RecentTask的信息获取是在TaskPersister.java中实现, 主要是去解析xml文件,此XML文件位于
5、/data/system_ce/0/recent_tasks目录下。最后调用createRecentTaskInfoFromTaskRecord()方法把TaskRecord信息转换成RecentTaskInfo的信息,自此就获取了所需的RecentTaskInfo信息Task获取流程(图二) 图二RecentTasks赋值还有一个疑问,mRecentTasks真正是在哪里赋值的呢?有两个地方,一是在startActivity的过程中,二是在activity 重新resume时。其中共涉及到四个类,见图三: 图三1) 先看startActivity时,在minimalResumeActivit
6、yLocked方法中将TaskRecord对象加入到mRecentTasks对象中然后,ActivityStack中的mRecentTasks是怎么和ActivityManagerService的mRecentTasks联系起来的呢?在ams初始化时创建了ActivityStackSupervisor对象,用来辅助ams管理ActivityStack,同时也创建了mRecentTasks对象,参数是ams和mStackSupervisor。而RecentTasks的构造函数中又把自己通过setRecentTasks的方法保存到了ActivityStackSupervisorActivitySt
7、ackSupervisor中也保存了一个RecentTasks对象,这样实际上和ActivityManagerService的mRecentTasks指向了同一个地址。在ActivityStackSupervisor中创建ActivityStack时,又把mRecentTasks传递到了ActivityStack中,这样ActivityStack中的mRecentTasks就和ActivityManagerService的mRecentTasks保持一致了。2)现在回到mRecentTasks的赋值问题,第二个时机是在activity 重新resume时,最终走到ActivityStack的r
8、esumeTopActivityInnerLocked函数中,其他与startActivity相似,就不再重新叙述一遍。缩略图获取近期任务中显示的缩略图除了栈顶正在显示的task是实时的截取屏幕图像(见RecentsTvImpl的getThumbnailTransitionActivityOptionsForTV),其他的最终走的TaskRecord里的getLastThumbnail(见RecentsTaskLoadPlan的preloadPlan),这里实际是去读取文件,这些缩略图已经保存在/data/system_ce/0/recent_images文件夹下。getLastThumbna
9、il只是把文件夹中的图片读取出来获取对应task的缩略图。具体流程见下图四: 图四但是这里除了栈顶的task其他的缩略图的读取都是在/data/system_ce/0/recent_images文件下,那这些图片是什么时候截取的呢?截图的时机是在activity onpause之后,我们从下图中可以看到可以看到执行截取图片的地方是在ActivityStack的screenshotActivitiesLocked这里,最终调用WindowManagerService的screenshotApplicationsInner。截图完成之后,最终通过saveImage方法保存到recent_image
10、s文件中截图流程图见图五: 图五近期任务显示上面讲解了task的获取及缩略图的获取,task的获取及缩略图的获取都是近期任务的显示的前提。从PhoneWindowManager获取到HOME按键消息后,先执行preloadRecentApps来获取recentTask,然后执行toggleRecentApps调起RecentsTvActivity显示。在RecentsTvActivityonResume时,会调用updateRecentsTasks()来获取前面的recentTask并在UI中显示出来。具体的流程可以见图六。图六RecentsTvActivity的layout文件是recent
11、s_on_tv.xml,在里面我们可以看到主要的view控件是TaskStackHorizontalGridView。下面类图即UI显示过程中所涉及到的所有的类:图七RecentAPP删除流程近期任务显示后,用户可以通过遥控器按键操作删除近期任务,跳转某个应用的操作,在这里我们主要讲解删除近期任务的流程。当从RecentsActivity移除某一个应用时,实际会调用到removeTask,然后调用到ams的removeTask方法,参数taskId为要移除的TaskRecord的id,然后调用ActivityManagerService的removeTaskByIdLocked,这里我们来分析
12、下removeTaskByIdLocked的参数:taskid为要移除的task id,killProcess为true,表示要杀掉该taskrecord里所有activity所在的进程,removeFromRecents为true,表示要从mRecentTasks移除。接着通过taskid找到该TaskRecord,然后首先调用了TaskRecord的removeTaskActivitiesLocked方法,传递下来的参数activityNdx = 0,表示吧整个TaskRecord移除。这里的mActivities是该TaskRecord中保存的所有ActivityRecord对象,sta
13、ck是该TaskRecord所在的ActivityStack,这里不为空,所以会调用ActivityStack的finishActivityLocked方法去移除该TaskRecord中的ActivityRecord对象。从ActivityStack移除完TaskRecord之后回到removeTaskByIdLocked,然后又调用了cleanUpRemovedTaskLocked方法,如果参数removeFromRecents为true,会先将该TaskRecord从mRecentTasks中移除,然后过滤出可以杀掉的Process的ProcessRecord信息,放到procsToKill列表中。具体删除近期任务流程见图八:总结以上我们就可以对recentApp有一个整体的认识,recentAPP是通过StatusBarManagerService调起,然后从调用到界面显示有两个步骤Task获取和Task显示。Task获取又包含Task的赋值和缩略图的获取,这两个组成了近期任务显示所需的RecentTaskInfo信息。而recentTask的删除工作主要是在ActivityManagerService中完成。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1