关于Android原生5.0以上重启机器,之前的任务还是会显示出来的修改

原生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的源码了解更深。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值