【Android源码-AMS】(七) TaskPersister

注:本文作者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
 

三、主要成员

  1. private final RecentTasks mRecentTasks;
    传入的全局唯一的RecentTasks实例。

  2. private final SparseArray<SparseBooleanArray> mTaskIdsInFile = new SparseArray<>();
    以userId为Key,taskId为key,true为值的SparseBooleanArray为Vaule,只会在loadPersistedTaskIdsForUser()方法向其中添加元素。

  3. private final File mTaskIdsDir;
    各user的task id存放路径,在构造函数中初始化为/data/system_de/

  4. private long mNextWriteTime = 0;
    下次写入的时间,-1,500,3000。

  5. ArrayList<WriteQueueItem> mWriteQueue = new ArrayList<WriteQueueItem>();
    mWriteQueue保存外部传入的Task的信息、Image、Icon等,然后在mLazyTaskWriterThread不断地写入到本地文件。
     

四、主要方法

  1. startPersisting()
    启动mLazyTaskWriterThread线程,不断地写入Task信息到本地。这个方法是在AMS的systemReady中调用的,systemReady会在系统服务启动完成的时候回调:mTaskPersister.startPersisting();

  2. 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();

 

五、总结

  1. TaskPersister只在RecentTasks类中的成员实例,它负责近期任务的信息和截图保存到本地/data/system_de/目录。

  2. 系统在运行中会不断地存储Tasks信息及截图到本地文件,在手机重启后会恢复保存的recent tasks。

  3. LazyTaskWriterThread线程是一个死循环,不断地读取mWriteQueue中的项并写入到本地文件(时间间隔最大3s);saveImage()和wakeup()不断地向mWriteQueue添加新的截图或TaskRecord信息。

    原文作者:Nemo__
    原文地址: https://blog.csdn.net/nemo__/article/details/53509345
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞