ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:115.76KB ,
资源ID:2807928      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2807928.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(recentApps 处理流程.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

recentApps 处理流程.docx

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