当前位置: 移动技术网 > IT编程>移动开发>Android > Android 一键清理、内存清理功能实现

Android 一键清理、内存清理功能实现

2019年07月24日  | 移动技术网IT编程  | 我要评论

偷拍自拍亚洲色图,大连天健租房网,联想ibm官网

360桌面、金山清理大师等都提供了一键清理、一键加速等功能,其实就是杀一些后台进程来达到释放内存的目的。

基本思路就是列出所有运行的进程,查看其重要值(runningappprocessinfo.importance,值越大说明进程重要程度越低),可以设定一个阈值,如果该进程的重要值大于该阈值,就可以杀掉该进程。

进程的重要值有以下几个等级:

/**  
       * constant for {@link #importance}: this is a persistent process.  
       * only used when reporting to process observers.  
       * @hide  
       */  
      public static final int importance_persistent = 50;  
    
      /**  
       * constant for {@link #importance}: this process is running the  
       * foreground ui.  
       */  
      public static final int importance_foreground = 100;  
        
      /**  
       * constant for {@link #importance}: this process is running something  
       * that is actively visible to the user, though not in the immediate  
       * foreground.  
       */  
      public static final int importance_visible = 200;  
        
      /**  
       * constant for {@link #importance}: this process is running something  
       * that is considered to be actively perceptible to the user. an  
       * example would be an application performing background music playback.  
       */  
      public static final int importance_perceptible = 130;  
        
      /**  
       * constant for {@link #importance}: this process is running an  
       * application that can not save its state, and thus can't be killed  
       * while in the background.  
       * @hide  
       */  
      public static final int importance_cant_save_state = 170;  
        
      /**  
       * constant for {@link #importance}: this process is contains services  
       * that should remain running.  
       */  
      public static final int importance_service = 300;  
        
      /**  
       * constant for {@link #importance}: this process process contains  
       * background code that is expendable.  
       */  
      public static final int importance_background = 400;  
        
      /**  
       * constant for {@link #importance}: this process is empty of any  
       * actively running code.  
       */  
      public static final int importance_empty = 500;  

需要权限:

<uses-permission android:name="android.permission.kill_background_processes"/> 

具体操作代码如下:

package com.example.demo; 
 
import java.util.list; 
 
import android.app.activity; 
import android.app.activitymanager; 
import android.app.activitymanager.memoryinfo; 
import android.app.activitymanager.runningappprocessinfo; 
import android.content.context; 
import android.content.pm.packagemanager; 
import android.content.pm.packagemanager.namenotfoundexception; 
import android.os.bundle; 
import android.util.log; 
import android.view.menu; 
import android.view.menuitem; 
import android.view.view; 
import android.widget.toast; 
 
public class cleanprocessactivity extends activity { 
 
  private static final string tag = "clean"; 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.activity_clean_process); 
  } 
  public void clean(view v){ 
    //to change body of implemented methods use file | settings | file templates.  
    activitymanager am = (activitymanager) getsystemservice(context.activity_service);  
    list<runningappprocessinfo> infolist = am.getrunningappprocesses();  
    list<activitymanager.runningserviceinfo> serviceinfos = am.getrunningservices(100);  
 
    long beforemem = getavailmemory(this);  
    log.d(tag, "-----------before memory info : " + beforemem);  
    int count = 0;  
    packagemanager pm = getpackagemanager(); 
     
    if (infolist != null) {  
      for (int i = 0; i < infolist.size(); ++i) {  
        runningappprocessinfo appprocessinfo = infolist.get(i);  
        log.d(tag, "process name : " + appprocessinfo.processname);  
        //importance 该进程的重要程度 分为几个级别,数值越低就越重要。  
        log.d(tag, "importance : " + appprocessinfo.importance);  
         
          
 
        // 一般数值大于runningappprocessinfo.importance_service的进程都长时间没用或者空进程了  
        // 一般数值大于runningappprocessinfo.importance_visible的进程都是非可见进程,也就是在后台运行着  
        if (appprocessinfo.importance > runningappprocessinfo.importance_visible) {  
          string[] pkglist = appprocessinfo.pkglist;  
          for (int j = 0; j < pkglist.length; ++j) {//pkglist 得到该进程下运行的包名  
            string appname = null; 
            try { 
              appname = (string) pm.getapplicationlabel(pm.getapplicationinfo(pkglist[j], 0));  
            } catch (namenotfoundexception e) { 
              // todo auto-generated catch block 
              e.printstacktrace(); 
            } 
            log.d(tag, "it will be killed, package name : " + pkglist[j]+" -- "+appname );  
            am.killbackgroundprocesses(pkglist[j]);  
            count++;  
          }  
        }  
 
      }  
    }  
 
    long aftermem = getavailmemory(this);  
    log.d(tag, "----------- after memory info : " + aftermem);  
    toast.maketext(this, "clear " + count + " process, "  
          + (aftermem - beforemem) + "m", toast.length_long).show();  
  } 
  private long getavailmemory(cleanprocessactivity cleanprocessactivity) { 
    // 获取android当前可用内存大小  
    activitymanager am = (activitymanager) getsystemservice(context.activity_service);  
    memoryinfo mi = new memoryinfo();  
    am.getmemoryinfo(mi);  
    //mi.availmem; 当前系统的可用内存  
    //return formatter.formatfilesize(context, mi.availmem);// 将获取的内存大小规格化  
    log.d(tag, "可用内存---->>>" + mi.availmem / (1024 * 1024));  
    return mi.availmem / (1024 * 1024);  
  }  
} 

注意:

我这里选择阈值是importance_visible级别的,也就是非可见的后台进程和服务会被杀掉(一些系统进程肯定除外)。
清理的效果跟金山清理大师和360桌面的一键清理效果差不多。

如果不想杀的太凶,可以选择importance_service级别,杀掉那些长时间没用或者空进程了,这个级别的清理力度不够大,达不到金山清理大师的效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网