基于Android 7.0的近期任务列表进程清理实现
最近有小伙伴反应,上篇博客中提到的直接修改近期任务列表的方法在7.0的系统中无法使用,因为找不到onTaskViewDismissed()这个方法了。同时,RecentsActivity更新任务Tasks的方法和6.0相比也有很大的改变,具体改变请小伙伴自行研究,本文主要讲针对7.0改变实现进程清理的方法。
第一步、改造RecentsView
纵观RecentsView中的方法,并没有删除指定任务的方法。既然没有,那么我们就自己写一个呗。(下面的方法添加在RecentsView中)
public void dismissTask(Task t){
RecentsTaskLoader loader = Recents.getTaskLoader();
loader.deleteTaskData(t, false);
// Remove the old task from activity manager
Recents.getSystemServices().removeTask(t.key.id);
}
第二步、在RecentsActivity中执行清理逻辑
好了,那么我们要怎么进行清理呢,请听老夫慢慢道来。同样,在RecentsActivity中添加清理方法,方法如下所示:
private void cleanStack(){
if(is_clean){
reloadStackView();
TaskStack stack=mRecentsView.getStack();
Uri uri=Uri.parse("content://com.example.administrator.phoneclean.contentProvider");
Cursor cursor=getContentResolver().query(uri, null, null, null, null);
String packagename;
ArrayList<Task> tasks = stack.getStackTasks();
int taskCounts = tasks.size();
while(cursor.moveToNext()){
for (int j = 0; j < taskCounts; j++) {
Task t = tasks.get(j);
packagename=cursor.getString(cursor.getColumnIndex("packagename"));
if((t.key.baseIntent.getComponent().getPackageName()).equals(packagename)){
mRecentsView.dismissTask(t);
}
}
packagename=null;
}
cursor.close();
is_clean=false;
}
}
简单说明一下,要清理之前,我们通过reloadStackView()方法重新装载一下任务view以确保是最新的(博主第一次就是没加这个,有些情况进程没清掉),然后我们获取到所有的任务栈stack,最后我们只要对每个stack中的task进行遍历清理即可。再多说一嘴,博主使用自己的应用来提供需要清理的进程包名的,因此上面用了ContentResolver来提供数据。
第三步,在需要的时候调用该方法清理任务。
博主是通过在RecentsActivity中接受广播的方法清理的。在mSystemBroadcastReceiver这个系统广播接收器的filter中添加自己的action,然后收到广播后执行清理。
is_clean=true;
cleanStack();
总结
各位读者如果有啥提问或者建议,可以在下面评论,博主看到会第一时间回复的,如果有大神有指教的,还望指点小弟,3ks!期待8.0的变化中~~