版权声明:本文为作者原创,转载必须注明出处。
转载请注明出处:http://www.jianshu.com/p/156d6ea2e8c0
RecentsActivity是SystemUI用于显示最近使用的应用列表,这篇文章对它进行一个简要的分析。
首先是用户点击SWITCH按键,PhoneWindowManager会在事件分发前先拦截该事件:
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
……
else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) {
……
if (!keyguardOn) {
if (down && repeatCount == 0) {
preloadRecentApps();
} else if (!down) {
toggleRecentApps();
}
}
return -1;
}
……
}
在key down时,load最近使用的apps->preloadRecentApps();
在key up时,打开或关闭Recent Panel-> toggleRecentApps();
在这里主要讨论三个方面:
1、task的获取:
流程如下:
接上图
第9步:TaskPersister 的restoreTasksForUserLocked
主要是去解析xml文件,位于/data/system_ce/0/recent_tasks目录下
可以看到这些task信息是以文件形式保存的,这就是重启后进RecentsActivity看到task还在的原因。
解析完这些xml文件就获取到了初始的task信息。
但实际上loadUserRecentsLocked里面的语句是只会在开机初始化时执行一次
最后通过:AMS调用createRecentTaskInfoFromTaskRecord()方法把TaskRecord信息转换成RecentTaskInfo的信息。
2、应用缩略图的获取:
获取到RecentTaskInfo之后就要去获取缩略图信息了,流程如下:
这里除了栈顶正在显示的TaskRecord回去实时的截取屏幕图像,其他的走getLastThumbnail
这里实际是去读取文件,这些缩略图已经保存在/data/system_ce/0/recent_images文件夹下
把这些文件读取出来就获取到了task的缩略图。
但是这里并没有看到去截屏,这些图片是什么时候截取的呢?如下流程:
截图的时机是在activity onPause之后。在第6步,先执行screenshotActivitiesLocked(r)是真正截图的地方,截图完成之后,执行updateThumbnialLocked最终通过saveImage方法保存到文件中,这里path为/data/system_ce/0/recent_images文件夹,这样需要获取缩略图时之前去读文件就可以了。
3、task移除:
具体流程如下:
removeTask主要的逻辑在cleanUpRemovedTaskLocked中实现。
杀进程的逻辑在killUnneededProcessLocked中,接着调用android.os.Process.killProcessQuiet方法来杀进程。
参考文章:
http://blog.csdn.net/kebelzc24/article/details/53765379
http://blog.csdn.net/qq_27215521/article/details/61414105
https://yq.aliyun.com/articles/4136