Android系统级开发进程清理功能的一些记录和发现(二)

基于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的变化中~~

发布了14 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qwe749082787/article/details/78296405
今日推荐