原生Android5.0之后系统会将最近任务数据存储到持久存储中,这样手机重启后打开最近任务界面,之前的任务还是会显示出来。
当前的平台是展讯7731g平台6.0系统,具体文件系统保存在/data/system/recent_images和/data/system/recent_tasks这两个目录中,见下图(设备root后DDMS可以查看):
具体存储这件事的的类是frameworks层中的TaskPersister.Java中的一个内部类LazyTaskWriterThread,LazyTaskWriterThread继承了Thread。然而,当重启系统的时候需要将上次保存的数据读取出来。用到的也是TaskPersister.java类中的restoreTasksLocked()方法。类所在位置:./frameworks/base/services/core/java/com/android/server/am/TaskPersister.java
当系统重启的时候,会由ActivityManagerService操作TaskPersister类的restoreTasksLocked方法去读取,见下面代码:
ActivityManagerService在源码中的位置:./frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:
public void systemReady(final Runnable goingCallback) {
synchronized(this) {
if (mSystemReady) {
// If we're done calling all the receivers, run the next "boot phase" passed in
// by the SystemServer
if (goingCallback != null) {
goingCallback.run();
}
return;
}
mLocalDeviceIdleController
= LocalServices.getService(DeviceIdleController.LocalService.class);
// Make sure we have the current profile info, since it is needed for
// security checks.
updateCurrentProfileIdsLocked();
mRecentTasks.clear();
mRecentTasks.addAll(mTaskPersister.restoreTasksLocked());
mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
mTaskPersister.startPersisting();
//省略部分代码,保留关键部分
}
}
现在客户有一个需求,就是在设备重启的时候不需要显示上一次保存的应用。
这个需求其实很简单哟,TaskPersister类里添加删除保存的数据的方法,在ActivityManagerService初始化的时候调用就好了,见一下代码:
TaskPersister里添加删除的方法:
private void removeAllTasks(File[] files) {
if (files == null) {
Slog.e(TAG, "File error accessing recents directory (too many files open?).");
return;
}
for (int fileNdx = 0; fileNdx < files.length; ++fileNdx) {
File file = files[fileNdx];
file.delete();
}
}
public void removeAllTasks() {
removeAllTasks(sTasksDir.listFiles());
removeAllTasks(sImagesDir.listFiles());
}
ActivityManagerService类初始化的时候调用:
public void systemReady(final Runnable goingCallback) {
synchronized(this) {
if (mSystemReady) {
// If we're done calling all the receivers, run the next "boot phase" passed in
// by the SystemServer
if (goingCallback != null) {
goingCallback.run();
}
return;
}
mLocalDeviceIdleController
= LocalServices.getService(DeviceIdleController.LocalService.class);
// Make sure we have the current profile info, since it is needed for
// security checks.
updateCurrentProfileIdsLocked();
//这里读取数据之前就删除
mTaskPersister.removeAllTasks();
mRecentTasks.clear();
mRecentTasks.addAll(mTaskPersister.restoreTasksLocked());
mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
mTaskPersister.startPersisting();
}
//省略部分代码,保留关键部分
}
就这样咯,可以去看一下 TaskPersister和ActivityManagerService的源码了解更深。