zoukankan      html  css  js  c++  java
  • android 内存清理

    这两天在搞个内存清理小插件,网上很少这方面资料,之前找过清理缓存的例子测试,结果不成功。后来自己思考该怎么清理内存,于是成功搞出来了。

    这两个方法是网上拷别人的,分别用来得到可用内存和内存总数,这样我们就可用得到了已用内存数。

    View Code
        private long getAvailMemory(Context context) 
    {
    // 获取android当前可用内存大小
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    MemoryInfo mi = new MemoryInfo();
    am.getMemoryInfo(mi);
    //mi.availMem; 当前系统的可用内存

    //return Formatter.formatFileSize(context, mi.availMem);// 将获取的内存大小规格化
    return mi.availMem/(1024*1024);
    }

    private long getTotalMemory(Context context)
    {
    String str1 = "/proc/meminfo";// 系统内存信息文件
    String str2;
    String[] arrayOfString;
    long initial_memory = 0;

    try
    {
    FileReader localFileReader = new FileReader(str1);
    BufferedReader localBufferedReader = new BufferedReader(
    localFileReader, 8192);
    str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小

    arrayOfString = str2.split("\\s+");
    for (String num : arrayOfString) {
    Log.i(str2, num + "\t");
    }

    initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 获得系统总内存,单位是KB,乘以1024转换为Byte
    localBufferedReader.close();

    } catch (IOException e) {
    }
    //return Formatter.formatFileSize(context, initial_memory);// Byte转换为KB或者MB,内存大小规格化
    return initial_memory/(1024*1024);
    }

    在Service里面清理内存

    自己写的小方法,通过判断进程信息来判断哪些进程是无用的可用杀掉

    View Code
    ActivityManager activityManger=(ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> list=activityManger.getRunningAppProcesses();
    if(list!=null)
    for(int i=0;i<list.size();i++)
    {
    ActivityManager.RunningAppProcessInfo apinfo=list.get(i);

    System.out.println("pid "+apinfo.pid);
    System.out.println("processName "+apinfo.processName);
    System.out.println("importance "+apinfo.importance);
    String[] pkgList=apinfo.pkgList;

    if(apinfo.importance>ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE)
    {
    // Process.killProcess(apinfo.pid);
    for(int j=0;j<pkgList.length;j++)
    {
    //2.2以上是过时的,请用killBackgroundProcesses代替
    activityManger.restartPackage(pkgList[j]);
    }
    }

    解析如下:

    RunningAppProcessInfo 得到正在运行的进程信息

    pkgList:得到该进程下运行的包名

    importance:该进程的重要程度

    importance分为几个级别,数值越低就越重要。数值对应的重要性请看api,我判断是大于ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE的都杀掉,一般数值大于ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了。

    最后通过for循环把包名对应进程杀掉:

    2.2版本以下的用activityManger.restartPackage(pkgList[j]);   对应权限<uses-permission android:name="android.permission.RESTART_PACKAGES" />

    2.2以上的用killBackgroundProcesses(包名);    对应权限<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

    之前我以为可用android.os.Process.killProcess(pid);来杀掉其他进程,后来发觉不行

    网上找到的解析是

    对于这个方法,需要详细解释一下。在SDK的文档中,解释如下:

    Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes.

    英语不好,不能准确翻译,所以希望大家自己理解,免得对大家造成误解。我个人对这句话的解释就是,这个方法使用是有条件的:

    a、将被杀掉的进程 和 当前进程 处于同一个包或者应用程序中;

    b、将被杀掉的进程 是由当前应用程序所创建的附加进程;

    c、将被杀掉的进程 和 当前进程 共享了普通用户的UID。(这里的普通用户,是相对于Root权限的用户来说的)

  • 相关阅读:
    扫移动护理系统mysql数据库视图的Database通讯点报错Caused by: java.sql.SQLException: Value '00000000 00:00:00' can not be represented as java.sql.Timestamp
    ORACLE sql insert case when
    解决超过4000字符的字符串insert的时候报错ORA01461: 仅能绑定要插入LONG列的LONG值
    将92服务器上面的加解密服务run.bat形式改为后台服务形式
    Oracle调整sga_max_size内存参后报ORA00844和ORA00851 SGA_MAX_SIZE 42949672960 cannot be set to more than MEMORY_TARGET 6979321856. 导致数据库连接不上去,提示ORA01034:ORACLE notavailable
    解决MATLAB一直初始化,加速MATLAB(转载)
    WIN7下隐藏或显示Lenovo_Recovery_Q盘(转载)
    flowable流程中心设计(一)
    mysqlgroup by原理
    SpringMVC系列导航
  • 原文地址:https://www.cnblogs.com/helloandroid/p/2212334.html
Copyright © 2011-2022 走看看