一、启动
通过手势启动RecentsActivity
二、显示:在启动RecentsActivity之后,会显示最近任务列表
1. RecentsActivity.java:Recents显示Activity
RecentsActivity继承了StatefulActivity,有些方法实现是在父类里面执行的,在onCreate()里面执行setupViews(),setupViews()中初始化了FallbackRecentsView,FallbackRecentsView继承了RecentsView,主要逻辑都是在RecentsView里面实现的,直接看RecentsView的实现逻辑:
2. RecentsView.java:Recents显示主View
在构造方法内部,获取了RecentsModel实例,创建了ViewPool实例mTaskViewPool,该mTaskViewPool存储TaskView,对应的layout为 R.layout.task,最大数量为20;
在RecentsView显示时会回调onAttachedToWindow(),在内部执行了updateTaskStackListenerState(),然后做了一些注册回调操作,当有变化时,会进行回调通知来更新UI;
在updateTaskStackListenerState()内部会进行一系列条件判断来确定是否执行reloadIfNeeded(),当首次进入时会执行reloadIfNeeded():
通过RecentsModel的getTasks()来获取任务列表,然后回到applyLoadPlan()。
在applyLoadPlan()内部,主要执行了四项工作:
- unloadVisibleTaskData():将现有visible的task数据进行置空;
- 根据task数量(首次进入)进行addView,TaskView通过mTaskViewPool的getView()进行获取,最后添加clearAllButton;
- 对添加完的TaskView进行bind()操作,将对应的task存在TaskView内部,类似setTag()功能;
- 执行resetTaskVisuals()来刷新加载数据;
最终在loadVisibleTaskData()里面通过TaskView的onTaskVisibilityChanged(true)来加载数据;
3. TaskView.java:Recents列表中Task对应的显示View
在onTaskListVisibilityChanged()内部,当visible为true时,执行mSnapshotView.setThumbnail()和setIcon()分别来加载缩略图和icon;当visible为false时,将其置空;
在TaskView内部设置了点击事件监听,当点击后会执行launchTask,最终会调用到ActivityManagerWrapper的startActivityFromRecentsAsync()来快速切换到对应的任务;
4. RecentsModel.java:Recents数据获取功能管理类
RecentsModel继承了TaskStackChangeListener,在构造方法内部初始化了RecentsTaskList、TaskIconCache和TaskThumbnailCache实例,注册了registerTaskStackListener回调;分别来获取最近任务列表、获取Task对应的Icon和,RecentsTaskList:获取最近任务列表;TaskIconCache:获取Task对应的icon,并进行缓存;TaskThumbnailCache:获取Task对应的thumbnailData,并进行缓存;
执行getTasks时,实际是通过RecentsTaskList的getTasks()来执行的;
当Task的snapshot截取完毕后,会收到onTaskSnapshotChanged()回调,先对snapshot进行缓存,然后执行onTaskThumbnailChanged()通知,在RecentsView里面对thumbnail进行更新;
5. RecentsTaskList.java:获取最近任务列表类
在getTasks()内部通过loadTasksInBackgroud()来获取TaskLoadResult对象mResultsBg,然后在主线程里面进行回调,最终执行到RecentsView里面的applyLoadPlan()是在主线程里面刷新UI;先看一下loadTasksInBackground()方法:
可以看到,在loadTasksInBackgroud()内部,通过ActivityManagerWrapper的getRecentTasks()来获取rawTasks,然后反向排序,最后将其处理添加到allTasks,然后返回结果。