recentApps 处理流程.docx

上传人:b****5 文档编号:2807928 上传时间:2022-11-15 格式:DOCX 页数:10 大小:115.76KB
下载 相关 举报
recentApps 处理流程.docx_第1页
第1页 / 共10页
recentApps 处理流程.docx_第2页
第2页 / 共10页
recentApps 处理流程.docx_第3页
第3页 / 共10页
recentApps 处理流程.docx_第4页
第4页 / 共10页
recentApps 处理流程.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

recentApps 处理流程.docx

《recentApps 处理流程.docx》由会员分享,可在线阅读,更多相关《recentApps 处理流程.docx(10页珍藏版)》请在冰豆网上搜索。

recentApps 处理流程.docx

recentApps处理流程

recentApps处理流程

目录

RecentAPP显示流程1

task的获取3

RecentTasks赋值4

缩略图获取7

近期任务显示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中完成。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1