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

本文详细介绍了在Android 7.0系统中如何实现进程清理功能,包括改造RecentsView,添加清理逻辑到RecentsActivity,以及在何时调用清理方法。通过接收广播并在RecentsActivity中执行清理,解决了7.0系统中onTaskViewDismissed方法缺失的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值