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

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级别,杀掉那些长时间没用或者空进程了,这个级别的清理力度不够大,达不到金山清理大师的效果。

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

(0)

相关推荐

  • Android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)demo实例详解

    最近接了一个项目其中有功能要实现一个清理内存,要求和微信的效果一样.于是想到用surfaceView而不是继承view.下面小编给大家解析下实现思路. surfaceView是为了解决频繁绘制动画产生了闪烁,而采用了双缓冲机制,即A.B两个缓冲轮流显示在画布上,同时,使用不当,同样容易产生闪烁,这是由于A.B中有一个缓冲没有改变. 在我写这个view的时候就遇到了这个问题,研究了好久终于解决. 首先说一下思路: 微信清理缓存的动画是: 一个圆环不停的转动,同时中间有文字显示-->加载完成后,出现

  • Android实现仿360桌面悬浮清理内存

    今天闲来无事写了一个清内存的小东西,类似360,在桌面上悬浮,点击后清除后台无用程序,清除后台程序是通过调用ActivityManger.killBackgroundProcesses的方式来进行的,这样的方式有个不好的地方,就是重要性级别设置的高的应用杀不掉.关键代码如下所示 ActivityManager mActivityManager = MyManager.getActivityManager(mContext); List<ActivityManager.RunningAppProc

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

    360桌面.金山清理大师等都提供了一键清理.一键加速等功能,其实就是杀一些后台进程来达到释放内存的目的. 基本思路就是列出所有运行的进程,查看其重要值(RunningAppProcessInfo.importance,值越大说明进程重要程度越低),可以设定一个阈值,如果该进程的重要值大于该阈值,就可以杀掉该进程. 进程的重要值有以下几个等级: /** * Constant for {@link #importance}: this is a persistent process. * Only

  • Android自定义View实现内存清理加速球效果

    前言 用过猎豹清理大师或者相类似的安全软件,大家都知道它们都会有一个功能,那就是内存清理,而展现的形式是通过一个圆形的小球来显示内存大小,通过百分比数字以及进度条的形式来显示清理的进度.本文将对该效果的实现过程进行详细讲述,但不涉及内存清理的实现. 预览 我们先来看看最终实现的效果是怎样的(gif效果有点差): 从上面的图片,我们可以看出: ①当加速球View显示的时候,进度条以及百分比数字会从0%开始增加到某一数值(60%). ②进度条停止增加后,中间的圆沿着Y轴开始翻转,会翻转180度,上面

  • Python实现清理重复文件功能的示例代码

    目录 前置 查找.删除重复文件 GUI制作 GUI界面设计 逻辑设计 效果展示 在电脑上或多或少的存在一些重复文件,体积小的倒没什么,如果体积大的就很占内存了,而如果自己一个一个查看文件是否重复,然后再删除,还是很要命的. 为此,我用python制作了一个删除重复文件的小工具,核心代码很简单,就十行代码,不管什么类型的文件都可以一键删除! 前置 PySimpleGUI库用来创建可视化界面,os操作文件,只需要这两个库: import os import PySimpleGUI as sg os为

  • linux 清理内存命令详细介绍

    linux 清理内存命令 1.清理前内存使用情况 free -m 2.开始清理  echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: # sync # echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches cache释放: To free page

  • 查看Linux内存条数与清理内存的命令方法

    1.查看当前内存使用状态 free -m   或者 free -g (-m按MB查看, -g按GB查看) 2.整理内存 echo 1 > /proc/sys/vm/drop_caches 3.查看内存条数命令: dmidecode |grep -A16 "Memory Device$" 以上就是小编为大家带来的查看Linux内存条数与清理内存的命令方法全部内容了,希望大家多多支持我们~

  • linux 内存清理/释放命令总结

    本文介绍了linux 内存清理/释放命令,具体如下: 1.清理前内存使用情况 free -m 2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: dmidecode | grep -A16 "Memory Device$" # sync # echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_cac

  • 详解C#中的System.Timers.Timer定时器的使用和定时自动清理内存应用

    项目比较大有时候会比较卡,虽然有GC自动清理机制,但是还是有不尽人意的地方.所以尝试在项目启动文件中,手动写了一个定时器,定时清理内存,加快项目运行速度. public class Program { [DllImport("psapi.dll")] static extern int EmptyWorkingSet(IntPtr hwProc); //清理内存相关 static void Main() { //启动定时清理内存 SetTimer(); } /// <summar

  • Android 代码一键实现银行卡绑定功能

    前言 今天小编给大家带来的是用代码一键实现银行卡识别与绑定功能. 银行卡识别的应用场景   介绍开发步骤前,我们先来谈谈银行卡识别的具体应用场景,银行APP.移动支付.缴费类APP.电商类APP或者其它带支付功能的APP在使用过程中往往会遇到如下常见的几个应用场景: 绑卡支付   常用于支付类APP,或者带支付功能的APP,用来绑定信用卡.银联借记卡,提供在线支付功能.转账汇款   常用于银行或者支付类APP,用来给本行或者他行用户进行转账.实名认证.身份审核   比如社交类APP,通过银行卡关

  • Python实现清理微信僵尸粉功能示例【基于itchat模块】

    本文实例讲述了Python实现清理微信僵尸粉功能.分享给大家供大家参考,具体如下: 原理 通过Pyhton调用itchat模块登录网页版微信,给你所有好友发送特殊符号,对方收不到这个特殊符号,只要有人删了你,你的微信就会显示被删的人. 所需环境 Python3 itchat模块 安装 pip install itchat 使用 新建qf.py文件,拷贝下面代码,保存 import itchat import time itchat.auto_login(hotReload=True) # 热加载

随机推荐