任务管理器(ActivityManager)

时间:2022-04-24
本文章向大家介绍任务管理器(ActivityManager),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

任务管理器(ActivityManager)

AndroidActivityManager类似于Windows下的任务管理器,能得到正在运行程序的内容等信息

  1. List getRunningServices(int maxNum) Return a list of the services that are currently running. 这个maxNum是指返回的这个集合的最大值 可以利用ActivityManager去判断当前某个服务是否正在运行。
  2. List getRunningAppProcesses() Returns a list of application processes that are running on the device.
  3. List getRecentTasks(int maxNum, int flags) 得到最近使用的程序,集合中第一个元素是刚才正在使用的
  4. Debug.MemoryInfo[] getProcessMemoryInfo(int[] pids) Return information about the memory usage of one or more processes. 可以通过某个进程的id得到进程的内存使用信息,然后通过这个内存信息能够得到每个程序使用的内存大小 MemoryInfo中的方法 int getTotalPrivateDirty() Return total private dirty memory usage in kB得到占用内存的大小,单位是kb
/**
 * 返回所有的进程列表信息
 * @param context
 * @return
 */
public static List<TaskInfo> getTaskInfos(Context context){
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcessInfos = am.getRunningAppProcesses();
    List<TaskInfo> taskInfos = new ArrayList<TaskInfo>();
    PackageManager pm = context.getPackageManager();
    for(RunningAppProcessInfo appProcessInfo : appProcessInfos){
        String packname = appProcessInfo.processName;
        TaskInfo taskInfo = new TaskInfo();
        taskInfo.setPackname(packname);
        
        MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(new int[]{appProcessInfo.pid});
        long memsize = memoryInfos[0].getTotalPrivateDirty() * 1024;
        taskInfo.setMemsize(memsize);
        try {
            PackageInfo packInfo = pm.getPackageInfo(packname, 0);
            Drawable icon = packInfo.applicationInfo.loadIcon(pm);
            taskInfo.setIcon(icon);
            String name = packInfo.applicationInfo.loadLabel(pm).toString();
            taskInfo.setName(name);
            if(AppInfoProvider.filterApp(packInfo.applicationInfo)){
                taskInfo.setUserTask(true);
            }else{
                taskInfo.setUserTask(false);
            }
        } catch (NameNotFoundException e) {
            taskInfo.setIcon(context.getResources().getDrawable(R.drawable.ic_launcher));
            taskInfo.setName(packname);
            e.printStackTrace();
        } 
        taskInfos.add(taskInfo);
    }
    return taskInfos;
}
  1. 一键清理 杀死进程需要权限
 android.permission.KILL_BACKGROUND_PROCESSES  

杀死进程就是使用ActivityManager的killBackgroundProcess方法

 public void killBackgroundProcesses(String packageName) 
  1. 获取内存可用大小
public class ProcessStatusUtils {
       /**
        * 获取有多少个程序正处于运行状态.
        * @param context
        * @return
        */
       public static int getProcessCount(Context context){
           ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
           return am.getRunningAppProcesses().size();
       }
   
       /**
        * 获取手机里面可用的内存空间
        * @param context
        * @return long类型的byte的值
        */
       public static long getAvailRAM(Context context){
           ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
           MemoryInfo outInfo = new MemoryInfo();
           am.getMemoryInfo(outInfo);
           return outInfo.availMem;
       }
       //获取手机的总内存,Android的Api中没有提供获取总内存的方法,在linux系统中我们要通过这个文件才能得到总内存
       public static long getTotalRAM(){
           try {
               File file = new File("/proc/meminfo");//Android系统这个文件的第一行就能得到总的内存大小
               FileInputStream fis = new FileInputStream(file);
               BufferedReader br = new BufferedReader(new InputStreamReader(fis));
               String str = br.readLine();
               //MemTotal:         513248 kB
               char[] chars = str.toCharArray();
               StringBuffer sb = new StringBuffer();
               for(char c : chars){
                   if(c>='0'&&c<='9'){
                       sb.append(c);
                   }
               }
               return Integer.parseInt(sb.toString())*1024;//得到的是多少kb,将kb转成b
           } catch (Exception e) {
               e.printStackTrace();
               return 0;
           }
       }
   } 
   //上面的方法都是得到的多少比特的大小,在使用中可以使用Formatter.formatFileSize(Context context, long b)将其自动转成K,M,G等