美文网首页
Recents最近任务流程

Recents最近任务流程

作者: shuihuba | 来源:发表于2018-08-24 09:07 被阅读0次

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上。

相关文章

网友评论

      本文标题:Recents最近任务流程

      本文链接:https://www.haomeiwen.com/subject/ulfobftx.html