【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信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章