【Android源码-AMS】(七) TaskPersister
来源:互联网 发布:饥荒联机版网络较差 编辑:程序博客网 时间:2024/06/09 21:14
注:本文作者Nemo, http://blog.csdn.net/nemo__
一、包名
路径:frameworks/base/services/core/java/com/android/server/am/TaskPersister.java
包名:com.android.server.am.TaskPersister
父类:无
子类:无
二、概述
TaskPersister是从Android-5.0开始引入的一个类,用于重启后恢复recent tasks功能。它会把近期的Task和截图保存,重启后恢复到近期任务栏。
TaskPersister只在RecentTasks类中的成员实例,RecentTasks在构造函数中传入/data/system/
为保存路径。
7.0主要保存文件在几个路径(按userId存储):
用户id为0的Tasks:/data/system_ce/0/recent_tasks/12_task.xml
用户id为0的Image:/data/system_ce/0/recent_images/12_task_thumbnail.png
用户id为0的Activity-Icon:/data/system_ce/0/recent_images/12_activity_icon_18213511xxxx.png
用户id为0的所有tasks-id:/data/system_de/0/persisted_taskIds.txt
6.0上只有以下三个路径:
Tasks:/data/system/recent_tasks/12_task.xml
Image:/data/system/recent_images/12_task_thumbnail.png
Activity-Icon:/data/system/recent_images/12_activity_icon_18213511xxxx.png
三、主要成员
private final RecentTasks mRecentTasks;
传入的全局唯一的RecentTasks实例。private final SparseArray<SparseBooleanArray> mTaskIdsInFile = new SparseArray<>();
以userId为Key,taskId为key,true为值的SparseBooleanArray为Vaule,只会在loadPersistedTaskIdsForUser()方法向其中添加元素。private final File mTaskIdsDir;
各user的task id存放路径,在构造函数中初始化为/data/system_de/
。private long mNextWriteTime = 0;
下次写入的时间,-1,500,3000。ArrayList<WriteQueueItem> mWriteQueue = new ArrayList<WriteQueueItem>();
mWriteQueue保存外部传入的Task的信息、Image、Icon等,然后在mLazyTaskWriterThread不断地写入到本地文件。
四、主要方法
startPersisting()
启动mLazyTaskWriterThread线程,不断地写入Task信息到本地。这个方法是在AMS的systemReady中调用的,systemReady会在系统服务启动完成的时候回调:mTaskPersister.startPersisting();
saveImage(Bitmap image, String filePath)
saveImage()会不断地向mWriteQueue
增加ImageWriteQueueItem项。在TaskRecord.getTaskThumbnailLocked()
方法中,会调用到ActivityStack.screenshotActivitiesLocked()
方法,间接使用WindowManager.screenshotApplications()
来获取截图。
TaskThumbnail-Image: 【SystemUI.SystemServicesProxy】[getTaskThumbnail()] ↓【ActivityManagerService】[getTaskThumbnail()] ↓【TaskRecord】[getTaskThumbnailLocked()] ↓【TaskRecord】[setLastThumbnailLocked()] ↓【RecentTasks】[saveImage()] ↓【TaskPersister】[saveImage()] ↓ mWriteQueue.add();Activity-Icon: 【Activity】[setTaskDescription()][onApplyThemeResource()] ↓【ActivityManagerService】[setTaskDescription()] ↓【ActivityRecord】[setTaskDescription()] ↓【RecentTasks】[saveImage()] ↓【TaskPersister】[saveImage()] ↓ mWriteQueue.add();
3. wakeup(TaskRecord task, boolean flush)
wakeup()会不断地向mWriteQueue增加TaskWriteQueueItem项。
【ActivityManagerService】[notifyTaskPersisterLocked()] ↓【RecentTasks】[notifyTaskPersisterLocked()] ↓【TaskPersister】[wakeup()] ↓ mWriteQueue.add();
4. restoreTasksForUserLocked(final int userId)
会读取存储的Tasks信息到系统服务中。
外部getRecentTasks()接口:【ActivityManager】[getRecentTasks()] ↓【ActivityManagerService】[getRecentTasks()] ↓【RecentTasks】[loadUserRecentsLocked()] ↓【TaskPersister】[restoreTasksForUserLocked()] ↓ mWriteQueue.add();手机重启后,会恢复关机前的recent tasks: 【UserController】[finishUserBoot()] ↓【UserController】[maybeUnlockUser()] ↓【UserController】[unlockUserCleared()] ↓【UserController】[finishUserUnlocking()] SYSTEM_USER_UNLOCK_MSG ↓【RecentTasks】[loadUserRecentsLocked()] ↓【TaskPersister】[restoreTasksForUserLocked()] ↓ mWriteQueue.add();
五、总结
TaskPersister只在RecentTasks类中的成员实例,它负责近期任务的信息和截图保存到本地
/data/system_de/
目录。系统在运行中会不断地存储Tasks信息及截图到本地文件,在手机重启后会恢复保存的recent tasks。
LazyTaskWriterThread线程是一个死循环,不断地读取mWriteQueue中的项并写入到本地文件(时间间隔最大3s);saveImage()和wakeup()不断地向mWriteQueue添加新的截图或TaskRecord信息。
- 【Android源码-AMS】(七) TaskPersister
- 【Android源码-AMS】(五) TaskRecord
- 【Android源码-AMS】(一)Instrumentation类解析
- Android源码:AMS、PMS、WMS原理分析
- Android Ams浅析
- Android Ams浅析
- Android Ams浅析
- Android Ams浅析
- Android Ams浅析
- Android中的AMS
- Android AMS 浅析
- Android -- AMS总结
- Framework学习(七)AMS家族
- 杂谈-Android源码(AMS、PMS、WMS)及部分原理机制
- Android源码剖析之Framework层实战版(Ams管理Activity启动)
- 对Android广播接收与发出机制的一些AMS以外的源码分析
- Ams
- ams
- ListView与ScrollView冲突的4种解决方案
- Gson Model Annotations - @SerializedName 匹配多个反序列化名称
- 数据结构——线性表(链式存储)
- ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061 "Unknown error")
- 将Eclipse代码导入到AndroidStudio的两种方式
- 【Android源码-AMS】(七) TaskPersister
- PAT乙级 1051. 复数乘法 (15)
- Gson Builder — 基础和命名规则
- spring @requestbody什么时候用?,只有在request url的参数是json类型的时候才用
- 《python数据分析基础教程》
- Git基础(3):撤消操作和远程仓库的使用
- Android 利用接口将adapter中的控件传给activity,实现交互
- Gson Builder — 序列化空值
- POJ 2393 (贪心)