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上。
网友评论