[mobilesafe] 04_进程信息获取

Android 4.0

进程信息获取

步骤:1)获取进程的应用的图标,进程的包名、可用内存,是否用户进程,是否被选中(checkbox)
2)通过ActivityManager和PackageManager获取相关的信息
核心代码:
package cn.zengfansheng.mobilesafe.engine;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.os.Debug.MemoryInfo;
import cn.zengfansheng.mobilesafe.R;
import cn.zengfansheng.mobilesafe.domain.TaskInfo;
 
/**
* 4、进程信息提供者
* @author hacket
*/

public class TaskInfoProvider {
 
    /**
     * 1、获取当前系统中正在运行的进程的信息
     * @param context 上下文
     * @return 所有运行的进程的信息组成的List集合
     */

    public static List<TaskInfo> getTaskInfos(Context context) {
 
        List<TaskInfo> taskInfos = new ArrayList<TaskInfo>();
 
        // 1)得到包管理者
        PackageManager packageManager = context.getPackageManager();
        // 2)得到Activity管理者
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
 
        // 3)通过Activity管理者获取当前正在运行的进程的集合
        List<RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
 
        // 4)遍历当前正在运行进程的集合
        for (RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {
 
            TaskInfo taskInfo = new TaskInfo();
 
            // 4-1)获取正在运行的进程名,也就是应用程序的包名
            String packageName = runningAppProcessInfo.processName;// 应用程序名,就是包名
            taskInfo.setAppPackageName(packageName);// 设置包名
 
            // 4-2)获取当前正在运行的进程占用的内存大小
            MemoryInfo memoryInfo = activityManager.getProcessMemoryInfo(new int[]{runningAppProcessInfo.pid})[0];
            int memSize = memoryInfo.getTotalPrivateDirty()*1000;//当前运行的进程占用的内存大小,单位KB
            taskInfo.setMemSize(memSize);// 设置占用内存大小
 
            // runningAppProcessInfo.importance//进程的优先级别
            try {
 
                // 4-3)通过包管理者获取应用程序的信息
                ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
 
                // 4-4)应用的图标
                Drawable appIcon = applicationInfo.loadIcon(packageManager);
                taskInfo.setAppIcon(appIcon);// 设置应用的图标
 
                // 4-5)应用的名称
                String appName = applicationInfo.loadLabel(packageManager).toString();
                taskInfo.setAppName(appName);// 设置应用名
 
                if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {// 用户进程
                    taskInfo.setUserTask(true);// 用户程序
                } else {
                    taskInfo.setUserTask(false);// 系统程序
                }
            } catch (NameNotFoundException e) {
                e.printStackTrace();
                // 5) 对于系统的应用,有些应用程序没有包名,找不到,给一个系统默认的
                String appName = packageName;// 默认给包名
                taskInfo.setAppName(appName);
                taskInfo.setAppIcon(context.getResources().getDrawable(R.drawable.ic_launcher));
            }
            taskInfos.add(taskInfo);
        }
        return taskInfos;
    }
}
SystemInfoUtils.java  
package cn.zengfansheng.mobilesafe.utils;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
 
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
 
/**
* 5、获取系统信息的工具类
* @author hacket
*/

public class SystemInfoUtils {
 
    /**
     * 1、返回当前正在运行的进程的个数
     * @param context 上下文
     * @return 当前正在运行的进程的个数
     */

    public static int getRunningProcCount(Context context) {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        return activityManager.getRunningAppProcesses().size();
    }
 
    /**
     * 2、返回可用的内存
     * @param context 上下文
     * @return 返回可用的内存
     */

    public static long getAvailableMemory(Context context) {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        MemoryInfo outInfo = new MemoryInfo();
        activityManager.getMemoryInfo(outInfo);
        long availMem = outInfo.availMem;
        return availMem;
    }
 
    /**
     * 3、返回总的内存
     * @param context 上下文
     * @return 返回总的内存
     */

    @SuppressLint("NewApi") //totalMem,需要api16才支持
    public static long getTotalMemory(Context context) {
 
        // 1、获取总内存:在api16以上可以用
        /*ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        MemoryInfo outInfo = new MemoryInfo();
        activityManager.getMemoryInfo(outInfo);
        long totalMem = outInfo.totalMem;*/

 
        // 2、获取总内存:在低版本的也可以用
        BufferedReader br = null;
        long totalMem = 0;
        try {
            File meminfo = new File("/proc/meminfo");
            FileInputStream fis = new FileInputStream(meminfo);
 
            br = new BufferedReader(new InputStreamReader(fis));
            String line = br.readLine();
 
            StringBuilder sb = new StringBuilder();
            char[] charArray = line.toCharArray();
            for (char c : charArray) {
                if (c >= '0' && c <= '9') {// 是数字
                    sb.append(c);
                }
            }
            String string = sb.toString();
            totalMem = Long.parseLong(string) * 1000;// 由于在/pro/meninfo下获取总内存单位是KB.需要乘以1000
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if (br != null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                br = null;
            }
        }
        return totalMem;
    }
}
获取总内存:
/proc/meminfo文件里面的信息
meminfo:

/proc/cpuinfo文件里面的信息
cpuinfo:
问题1:低版本的不支持
// 1、获取总内存:在api16以上可以用
        /*ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        MemoryInfo outInfo = new MemoryInfo();
        activityManager.getMemoryInfo(outInfo);
        long totalMem = outInfo.totalMem;*/
         
上面的获取总内存,要api16才支持,所以用下面的代码;
/**
 * 3、返回总的内存
 * @param context 上下文
 * @return 返回总的内存
 */
@SuppressLint("NewApi"//totalMem,需要api16才支持
public static long getTotalMemory(Context context) {
    // 1、获取总内存:在api16以上可以用
    /*ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    MemoryInfo outInfo = new MemoryInfo();
    activityManager.getMemoryInfo(outInfo);
    long totalMem = outInfo.totalMem;*/
    
    // 2、获取总内存:在低版本的也可以用
    BufferedReader br = null;
    long totalMem = 0;
    try {
        File meminfo = new File("/proc/meminfo");
        FileInputStream fis = new FileInputStream(meminfo);
        
        br = new BufferedReader(new InputStreamReader(fis));
        String line = br.readLine();
        StringBuilder sb = new StringBuilder();
        char[] charArray = line.toCharArray();
        for (char c : charArray) {
            if (c >= '0' && c <= '9') {// 是数字
                sb.append(c);
            }
        }
        String string = sb.toString();
        totalMem = Long.parseLong(string) * 1000;// 由于在/pro/meninfo下获取总内存单位是KB.需要乘以1000
        
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        try {
            if (br != null)
                br.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            br = null;
        }
    }
    return totalMem;
}