Recents最近任务流程

Recents是SystemUI中处理最近任务的模块,点击最近任务键时,会调出最近任务界面,以列表形式显示系统最近运行的应用程序。

本文介绍Recents模块的启动流程,最近任务元数据加载流程,最近任务应用图标和缩略图的加载流程。


Recents启动

SystemUI启动的时候,会启动一系列服务,其中就有Recents。

调用顺序为:SystemUIService.onCreate  -> SystemUIApplication.startServicesIfNeeded -> Recents.start

Recents.start 代码:

在Recents.start()中,创建了一些主要的成员。

sSystemServicesProxy ------ 提供接口,从系统获取最近任务元数据,缩略图,应用图标等。

sConfiguration ------最近任务的运行配置,是否大屏,是否低内存机器,从桌面进入还是从app进入等。

sTaskLoader ------ 资源加载器,调用sSystemServicesProxy的接口加载最近任务元数据,异步加载缩略图,应用图标。

mImpl  ------  RecentsImpl,Recents组件的具体实现,管理最近任务数据的加载,管理最近任务卡片的显示隐藏,从最近任务进出分屏等。


点击最近任务键后的最近任务加载流程:

Recents.preloadRecentApps ----加载最近任务元数据,同时加载应用图标,但是不加载缩略图。

调用顺序:Recents.preloadRecentApps  -->  RecentsImpl.preloadRecents  -->  mHandler.post(Runable)

Runable里会执行真正的加载任务。

在Runable中,首先获取sTaskLoader ,再由sTaskLoader 来创建sInstanceLoadPlan。

sTaskLoader .preloadTasks完成加载任务,加载的结果存储在sInstanceLoadPlan中。

sTaskLoader是一个RecentsTaskLoader类型的变量,完成对最近任务元数据,应用图标,缩略图加载的调度。由于对应用图标,缩略图的加载比较耗时,所以提供了异步调度的方式。

RecentsTaskLoader主要提供三个同步函数来加载最近任务相关数据。

preloadRawTasks()  ------  加载最近任务元数据,不包括应用图标和缩略图。

preloadTasks() ------  加载最近任务元数据,如果缓存中有对应的应用图标和缩略图,也会把缓存中的应用图标和缩略图加载进来,如果缓存中没有,则不会加载。

loadTasks()  ------  根据参数加载应用图标和缩略图,如果缓存中存在,先加载缓存中的应用图标和缩略图,如果缓存中不存在,则调用sSystemServicesProxy 从系统中获取。

RecentsTaskLoader也提供异步方式加载应用图标和缩略图,使用方式在后面的缩略图加载流程中详细分析。


Recents.toggleRecentApps ------ 如果最近任务界面正在显示,则隐藏最近任务。如果最近任务没有显示,则显示最近任务界面。

这里只分析显示最近任务的流程。

Recents.toggleRecentApps --> RecentsImpl.toggleRecents -->  RecentsImpl.startRecentsActivity  -->  RecentsActivity.reloadStackView

RecentsImpl.startRecentsActivity 启动RecentsActivity,这个Activity把最近任务以列表方式显示出来。


应用图标和缩略图的异步加载流程:

    最近任务中缩略图是RecentsTaskLoader使用异步方式加载的。

    首先在RecentsActivity.onStart中给RecentsView设置一个OnPreDrawListener。这个OnPreDrawListener会在RecentsView完成测量正式绘制之前调用。

    在OnPreDrawListener中,会调用RecentsTaskLoader.startLoader来启动异步加载任务。

  RecentsTaskLoader异步加载任务启动后,会不断循环处理加载队列mLoadQueue。每次处理时从队列中取出一项Task,调用SystemServicesProxy来从系统中取得应用图标和缩略图。这一逻辑是在processLoadQueueItem中处理的。

processLoadQueueItem的代码,取出每一个Task,调用SystemServicesProxy的接口取得相应的应用图标和缩略图。

RecentsTaskLoader的异步加载任务刚启动的时候,加载队列是空的。TaskStackView.onMeasure的时候才开始把加载项放到队列里。

TaskStackView.onMeasure -->  TaskStackView.bindTaskView --> RecentsTaskLoader.loadTaskData --> mLoadQueue.addTask

加入队列后,RecentsTaskLoader就开始处理,处理完会调用回调函数TaskView.onTaskDataLoaded来把应用图标和缩略图绘制到TaskView上。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,565评论 25 709
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,803评论 1 32
  • 1 今天早晨早起后,洗漱完毕之后,在家吃了早餐,在优惠时段,进入了地铁站,到达鼓楼时,只花费了3元,感觉很开心!...
    LiHongxi阅读 1,573评论 0 0
  • 淡忘中的京城记忆(二)故宫、景山、恭王府、后海、钟楼鼓楼(2016年8月27日——10月7日) 明清两代,存世已六...
    极庸斋主阅读 3,462评论 0 1
  • 创新的伙伴 创新的方式 创新的内容
    michaels_a8f4阅读 1,053评论 0 0