recentApps 处理流程Word文档格式.docx
- 文档编号:15719008
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:10
- 大小:115.76KB
recentApps 处理流程Word文档格式.docx
《recentApps 处理流程Word文档格式.docx》由会员分享,可在线阅读,更多相关《recentApps 处理流程Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
近期任务显示9
RecentAPP删除流程10
总结12
RecentAPP显示流程
近期任务中很重要的一部分是StatusBarManagerService,Recentapp的显示主要是通过其调起。
那我们就先分析下StatusBarManagerService,在系统初始化的时候我们获取了StatusBarManagerService,然后把它加入到了ServiceManager中,其中以Context.STATUS_BAR_SERVIER为标志,为方便了后面的获取。
SystemServer.java->
main()->
run()
接着就是对StatusBarManagerService的分析了,StatusBarManagerServiceextendsIStatusBarService.Stub就是一个IBinder对象,它通过ServiceManager.addService()的方式启动。
LocalServices是进程内调用的服务,那么StatusBarManagerInternal也就是在system_process进程中使用。
当用户长按HOME键的时候,PhoneWindowManager的interceptKeyBeforeDispatching()函数会对HOME按键进行处理,执行调起recentAPP应用。
从下面的截图我们可以看到,phonewindowManager是通过StatusBarManagerInternal来最终调用到StatusBarManagerService的toggleRecentApps函数,接着进而调用到IStatusBar子类CommandQueue的接口实现类BaseStatusBar中。
然后最终调起RecentsTvActivity显示出近期任务。
下面是recentAPP调起过程中所涉及的类图(图一)
图一
从interceptKeyBeforeDispatching开始到近期任务显示出来,分两部分工作。
一是task的获取,二是task的显示。
Task的获取主要是preloadRecentApps()来完成;
task获取后近期任务的显示是由toggleRecentApps()来完成。
下面我们将分别讲讲这两个流程:
task的获取
从下面的Task获取流程(图二)中可以看到,在ams中,有一个mRecentTasks对象,该对象保存了近期启动的task任务信息,RecentsActivity实际上是要获取mRecentTasks对象,而RecentTask的信息获取是在TaskPersister.java中实现,主要是去解析xml文件,此XML文件位于/data/system_ce/0/recent_tasks目录下。
最后调用createRecentTaskInfoFromTaskRecord()方法把TaskRecord信息转换成RecentTaskInfo的信息,自此就获取了所需的RecentTaskInfo信息
Task获取流程(图二)
图二
RecentTasks赋值
还有一个疑问,mRecentTasks真正是在哪里赋值的呢?
有两个地方,一是在startActivity的过程中,二是在activity重新resume时。
其中共涉及到四个类,见图三:
图三
1)先看startActivity时,在minimalResumeActivityLocked方法中将TaskRecord对象加入到mRecentTasks对象中
然后,ActivityStack中的mRecentTasks是怎么和ActivityManagerService的mRecentTasks联系起来的呢?
在ams初始化时创建了ActivityStackSupervisor对象,用来辅助ams管理ActivityStack,同时也创建了mRecentTasks对象,参数是ams和mStackSupervisor。
而RecentTasks的构造函数中又把自己通过setRecentTasks的方法保存到了ActivityStackSupervisor
ActivityStackSupervisor中也保存了一个RecentTasks对象,这样实际上和ActivityManagerService的mRecentTasks指向了同一个地址。
在ActivityStackSupervisor中创建ActivityStack时,又把mRecentTasks传递到了ActivityStack中,这样ActivityStack中的mRecentTasks就和ActivityManagerService的mRecentTasks保持一致了。
2)现在回到mRecentTasks的赋值问题,第二个时机是在activity重新resume时,最终走到ActivityStack的resumeTopActivityInnerLocked函数中,其他与startActivity相似,就不再重新叙述一遍。
缩略图获取
近期任务中显示的缩略图除了栈顶正在显示的task是实时的截取屏幕图像(见RecentsTvImpl的getThumbnailTransitionActivityOptionsForTV),其他的最终走的TaskRecord里的getLastThumbnail(见RecentsTaskLoadPlan的preloadPlan),这里实际是去读取文件,这些缩略图已经保存在/data/system_ce/0/recent_images文件夹下。
getLastThumbnail只是把文件夹中的图片读取出来获取对应task的缩略图。
具体流程见下图四:
图四
但是这里除了栈顶的task其他的缩略图的读取都是在/data/system_ce/0/recent_images文件下,那这些图片是什么时候截取的呢?
截图的时机是在activityonpause之后,我们从下图中可以看到可以看到执行截取图片的地方是在ActivityStack的screenshotActivitiesLocked这里,最终调用WindowManagerService的screenshotApplicationsInner。
截图完成之后,最终通过saveImage方法保存到recent_images文件中
截图流程图见图五:
图五
近期任务显示
上面讲解了task的获取及缩略图的获取,task的获取及缩略图的获取都是近期任务的显示的前提。
从PhoneWindowManager获取到HOME按键消息后,先执行preloadRecentApps来获取recentTask,然后执行toggleRecentApps调起RecentsTvActivity显示。
在RecentsTvActivityonResume时,会调用updateRecentsTasks()来获取前面的recentTask并在UI中显示出来。
具体的流程可以见图六。
图六
RecentsTvActivity的layout文件是recents_on_tv.xml,在里面我们可以看到主要的view控件是TaskStackHorizontalGridView。
下面类图即UI显示过程中所涉及到的所有的类:
图七
RecentAPP删除流程
近期任务显示后,用户可以通过遥控器按键操作删除近期任务,跳转某个应用的操作,在这里我们主要讲解删除近期任务的流程。
当从RecentsActivity移除某一个应用时,实际会调用到removeTask,然后调用到ams的removeTask方法,参数taskId为要移除的TaskRecord的id,然后调用ActivityManagerService的removeTaskByIdLocked,这里我们来分析下removeTaskByIdLocked的参数:
taskid为要移除的taskid,killProcess为true,表示要杀掉该taskrecord里所有activity所在的进程,removeFromRecents为true,表示要从mRecentTasks移除。
接着通过taskid找到该TaskRecord,然后首先调用了TaskRecord的removeTaskActivitiesLocked方法,传递下来的参数activityNdx=0,表示吧整个TaskRecord移除。
这里的mActivities是该TaskRecord中保存的所有ActivityRecord对象,stack是该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中完成。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- recentApps 处理流程 处理 流程