获取手机的运行内存,正在运行的进程

实体类如下,TaskInfo.java:

/**
 * 进程的信息封装类
 */
public class TaskInfo {
    /**
     * 进程的图标
     */
    private Drawable icon;

    /**
     * 进程的名字
     */
    private String name;

    /**
     * 为了区分进程的包名
     */
    private String packName;

    /**
     * 内存大小,以字节为单位
     */
    private int memorySize;


    /**
     * true代表用户进程,false代表系统进程
     */
    private boolean userTask;

    public Drawable getIcon() {
        return icon;
    }

    public void setIcon(Drawable icon) {
        this.icon = icon;
    }
    
    public int getMemorySize() {
        return memorySize;
    }

    public void setMemorySize(int memorySize) {
        this.memorySize = memorySize;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPackName() {
        return packName;
    }

    public void setPackName(String packName) {
        this.packName = packName;
    }

    public boolean isUserTask() {
        return userTask;
    }

    public void setUserTask(boolean userTask) {
        this.userTask = userTask;
    }

    @Override
    public String toString() {
        return "TaskInfo{" +
                "icon=" + icon +
                ", name='" + name + '\'' +
                ", packName='" + packName + '\'' +
                ", userTask=" + userTask +
                '}';
    }
}

工具类,SystemInfoUtils.java:

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Debug;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 获取系统正在运行的程序信息工具类
 */
public class SystemInfoUtils {

    /**
     * 获取正在运行的进程的数量
     * @param context 上下文
     */
    public static int getRunningProcessCount(Context context){
        //PackageManager 包管理器,相当于程序管理器.静态的内容
        //ActivityManager 进程管理器,管理手机的活动信息.动态的内容
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();//获取运行的进程
        return infos.size();
    }

    /**
     * 获取手机可用的剩余运行内存
     * @return 字节数
     */
    public static long getAvailMemory(Context context){
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo memoryInfo=new ActivityManager.MemoryInfo();
        am.getMemoryInfo(memoryInfo);
        return memoryInfo.availMem;
    }

    /**
     * 获取手机可用的总运行内存
     * 格式化字节为单位的大小:android.text.format.Formatter.formatFileSize(this, totalMemory)
     * 通过adb命令查看,adb shell进入
     * # cd proc    (进入系统的配置信息目录,可以使用ls -l命令查看)
     * # cat cpuinfo    (查看cpu信息)
     * # cat meminfo     (查看这个文件内容就可以看到内存信息)
     */
    public static long getTotalMemory(Context context){
       /* ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo memoryInfo=new ActivityManager.MemoryInfo();
        am.getMemoryInfo(memoryInfo);
        return memoryInfo.totalMem;//需要API16以上*/
        try {
            File file = new File("/proc/meminfo");
            FileInputStream fis = new FileInputStream(file);
            BufferedReader br = new BufferedReader(new InputStreamReader(fis));
            String totalRam = br.readLine();
            StringBuffer sb = new StringBuffer();
            //MemTotal:  513000 KB
            char[] cs = totalRam.toCharArray();
            for (char c : cs) {
                if (c >= '0' && c <= '9') {
                    sb.append(c);
                }
            }
            long result = Long.parseLong(sb.toString()) * 1024;//因为读出来的是KB,所以这里转换为B方便后面的格式化
            return result;//字节
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 获取所有的进程信息(包括进程的图片 名称 占用的内存大小)
     * TaskInfo为进程信息的封装类
     */
    public static List<TaskInfo> getTaskInfos(Context context){
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        PackageManager pm = context.getPackageManager();
        List<TaskInfo> taskInfos = new ArrayList<TaskInfo>();//存放得到的数据
        List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo info : infos) {
            TaskInfo taskInfo = new TaskInfo();//进程信息实体类
            String processName = info.processName; //获取应用包名
            //通过该应用的pid获取内存信息
            Debug.MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(new int[]{info.pid});
            int memsize = memoryInfos[0].getTotalPrivateDirty() * 1024;
            try {
                ApplicationInfo applicationInfo = pm.getApplicationInfo(processName, 0);
                Drawable icon=applicationInfo.loadIcon(pm);//获取图标
                String name=applicationInfo.loadLabel(pm).toString();//名称
                taskInfo.setIcon(icon);
                taskInfo.setName(name);
                taskInfo.setMemorySize(memsize);
                //判断是不是用户进程
                if((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)==0){
                    taskInfo.setUserTask(true);//用户进程
                }else{
                    taskInfo.setUserTask(false);//系统进程
                }
                taskInfos.add(taskInfo);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        return taskInfos;
    }
}

这里将listView显示就省略了.......直接看下效果图吧:

在设置适配器的时候只需要注意复用的问题:

//LinearLayout为item的布局,convertView为滑出去复用的View
if (convertView != null && (convertView instanceof LinearLayout)) {
      //避免复用产生空指针异常
      holder= (ViewHolder) convertView.getTag();
 }

 杀死进程见:杀死进程

注意:系统的有些进程你是杀不了的,但是为了更好的用户体验,在清理内存的时候,需要把杀不掉的进程也从listView中移除,这就需要使用假数据了,即:

把所有的进程数据都放到集合中,再将集合填充到listView中,当清理内存的时候,删除掉集合中对应的数据就可以了,这样用户就以为把进程都杀死掉了

posted @ 2016-09-06 17:43  ts-android  阅读(1534)  评论(0编辑  收藏  举报