您的位置:首页 > 移动开发 > Android开发

Android6.0获取进程和进程数目的方法

2017-09-08 20:11 281 查看


Android5.0之后使用

ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
//获取进程的集合
runningAppProcesses= activityManager.getRunningAppProcesses();
size = runningAppProcesses.size();

这种方法获取进程数,已经不可能了android开发越来越艰难,前天写进程管理的代码。在这里加以总结


1.若用户未开启权限,需要先开启权限:

[java] view
plain copy

protected void oncreat(){  

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  

            if (!hasPermission()) {  

                startActivityForResult(  

                        new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS),  

                        MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS);  

            }  

}  

 @Override  

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  

        if (requestCode == MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS) {  

            if (!hasPermission()) {  

                ##若用户未开启权限,则引导用户开启“Apps with usage access”权限  

                startActivityForResult(  

                        new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS),  

                        MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS);  

            }  

        }  

    }  

##//检测用户是否对本app开启了“Apps with usage access”权限  

  private boolean hasPermission() {  

        AppOpsManager appOps = (AppOpsManager)  

                getSystemService(Context.APP_OPS_SERVICE);  

        int mode = 0;  

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {  

            mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,  

                    android.os.Process.myUid(), getPackageName());  

        }  

        return mode == AppOpsManager.MODE_ALLOWED;  

    }      

2.提供的方法的集合

[java] view
plain copy

public static int size;  

  

   /** 

    * 获取进程数的方法 

    * @param context 

    * @return 

    */  

   public static int getProcessCount(Context context){  

       List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = null;  

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){  

           size = getTopApp(context);  

       }else {  

           ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  

           //获取进程的集合  

           runningAppProcesses= activityManager.getRunningAppProcesses();  

           size = runningAppProcesses.size();  

  

       }  

       return size;  

  

   }  

  

   /** 

    * 6.0获取进程数 

    * @param context 

    * @return 

    */  

   private static int getTopApp(Context context) {  

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  

           UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);  

           if (m != null) {  

               long now = System.currentTimeMillis();  

               //获取60秒之内的应用数据  

               List<UsageStats> stats = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 60 * 1000, now);  

               Log.i(TAG, "Running app number in last 60 seconds : " + stats.size());  

               String topActivity = "";  

               //取得最近运行的一个app,即当前运行的app  

               if ((stats != null) && (!stats.isEmpty())) {  

                   int j = 0;  

                   for (int i = 0; i < stats.size(); i++) {  

                       if (stats.get(i).getLastTimeUsed() > stats.get(j).getLastTimeUsed()) {  

                           j = i;  

                       }  

                       topActivity = stats.get(j).getPackageName();  

                       Log.i(TAG, "top running app is : "+topActivity);  

                   }  

  

               }  

               return stats.size();  

           }  

       }  

       return 0;  

   }  

  

   /** 

    *获取栈顶的包名 

    */  

  

   public static String getTopActivityApp(Context context) {  

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  

           UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);  

           if (m != null) {  

               long now = System.currentTimeMillis();  

               //获取60秒之内的应用数据  

               List<UsageStats> stats = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 60 * 1000, now);  

               Log.i(TAG, "Running app number in last 60 seconds : " + stats.size());  

  

               String topActivity = "";  

  

               //取得最近运行的一个app,即当前运行的app  

               if ((stats != null) && (!stats.isEmpty())) {  

                   int j = 0;  

                   for (int i = 0; i < stats.size(); i++) {  

                       if (stats.get(i).getLastTimeUsed() > stats.get(j).getLastTimeUsed()) {  

                           j = i;  

                       }  

                   }  

                   topActivity = stats.get(j).getPackageName();  

                   return topActivity;  

               }  

               Log.i(TAG, "top running app is : "+topActivity);  

           }  

       }  

       return null;  

   }  

   /** 

    * 获取可用内存的数据大小 ,单位为byte 

    * @param context 

    * @return 

    */  

   public static long getAvailSpace(Context context){  

       //获取activityManager  

       ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  

       //构建可用内存对象  

       ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();  

  

  

  

       activityManager.getMemoryInfo(memoryInfo);  

  

       long availMem = memoryInfo.availMem;  

       return availMem;  

   }  

  

   public static long getTotalSpace(Context context){  

       //获取activityManager  

       ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  

       //构建可用内存对象  

       ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();  

  

       activityManager.getMemoryInfo(memoryInfo);  

  

       return memoryInfo.totalMem;  

   }  

  

   /** 

    * 获取全部的内存空间 

    * @return 

    */  

   public static long getTotalSpace(){  

       FileReader fileReader=null;  

       BufferedReader bufferedReader=null;  

       try {  

           fileReader=new FileReader("proc/meminfo");  

  

           bufferedReader=new BufferedReader(fileReader);  

  

           String lineOne = bufferedReader.readLine();  

  

           char[] chars = lineOne.toCharArray();  

           StringBuffer stringBuffer = new StringBuffer();  

           for (char aChar : chars) {  

               if (aChar>='0'&&aChar<='9'){  

                   stringBuffer.append(aChar);  

               }  

           }  

           return Long.parseLong(stringBuffer.toString())*1024;  

       } catch (Exception e) {  

           e.printStackTrace();  

  

       }finally {  

           if (fileReader!=null&&bufferedReader!=null){  

               try {  

                   bufferedReader.close();  

                   fileReader.close();  

               } catch (IOException e) {  

                   e.printStackTrace();  

               }  

           }  

       }  

       return 0;  

   }  

  

   /** 

    * 获取进程的信息 

    * @param context 

    * @return 

    */  

   public  static List<ProcessInfoBean> getProcessInfo(Context context){  

  

       ArrayList<ProcessInfoBean> processInfoList = new ArrayList<>();  

       ActivityManager systemService = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  

  

       List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = systemService.getRunningAppProcesses();  

  

       PackageManager PM = context.getPackageManager();  

  

       for (ActivityManager.RunningAppProcessInfo runningAppProcess : runningAppProcesses) {  

  

           ProcessInfoBean processInfo=new ProcessInfoBean();  

  

           processInfo.packageName= runningAppProcess.processName;  

  

           //获取系统占用的内存大小  

           int pid = runningAppProcess.pid;  

           Debug.MemoryInfo[] processMemoryInfo = systemService.getProcessMemoryInfo(new int[]{pid});  

  

           //获取已使用的大小:  

           processInfo.memeSize= processMemoryInfo[0].getTotalPrivateDirty()*1024;  

  

           //获取应用的名称  

           try {  

               ApplicationInfo applicationInfo = PM.getApplicationInfo(processInfo.getPackageName(), 0);  

  

               processInfo.name= applicationInfo.loadLabel(PM).toString();  

  

               processInfo.icon= applicationInfo.loadIcon(PM);  

  

               if ((applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==ApplicationInfo.FLAG_SYSTEM){  

                   processInfo.isSystem=true;  

               }else {  

                   processInfo.isSystem=false;  

               }  

           } catch (PackageManager.NameNotFoundException e) {  

               processInfo.name=processInfo.packageName;  

               processInfo.icon=context.getResources().getDrawable(R.mipmap.ic_launcher);  

               processInfo.isSystem=true;  

               e.printStackTrace();  

           }  

           processInfoList.add(processInfo);  

       }  

       return processInfoList;  

   }  

  

   /** 

    * 6.0版本获取相应的进程信息 

    * @param context 

    * @return 

    */  

   public static List<ProcessInfoBean> getProcess6Info(Context context){  

       ArrayList<ProcessInfoBean> processInfoList = new ArrayList<>();  

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  

           UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);  

           if (m != null) {  

               long now = System.currentTimeMillis();  

               //获取60秒之内的应用数据  

               List<UsageStats> stats = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 60 * 1000, now);  

               ActivityManager systemService = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  

               Log.i(TAG, "Running app number in last 60 seconds : " + stats.size());  

               //取得最近运行的一个app,即当前运行的app  

               if ((stats != null) && (!stats.isEmpty())) {  

                   for (int i = 0; i < stats.size(); i++) {  

                      /* if (stats.get(i).getLastTimeUsed() > stats.get(j).getLastTimeUsed()) { 

                           j = i; 

                       }*/  

                       int i1 = stats.get(i).describeContents();  

                       String processName = stats.get(i).getPackageName();  

                       Log.i(TAG, "top running app is : " + processName);  

                       PackageManager PM = context.getPackageManager();  

                       ProcessInfoBean processInfo=new ProcessInfoBean();  

                       int uidForName = Process.getUidForName(processName);  

                       /*** 

                        * 此方法未能成功获取进程的内存信息 

                        */  

                       Debug.MemoryInfo[] processMemoryInfo = systemService.getProcessMemoryInfo(new int[]{uidForName});  

                       //获取已使用的大小:  

                       processInfo.memeSize= processMemoryInfo[0].getTotalPrivateDirty()*1024;  

                       processInfo.packageName= processName;  

                       processInfo.appPid=uidForName;  

                       //获取应用的名称  

                       try {  

                           ApplicationInfo applicationInfo = PM.getApplicationInfo(processInfo.getPackageName(), 0);  

  

                           processInfo.name= applicationInfo.loadLabel(PM).toString();  

  

                           processInfo.icon= applicationInfo.loadIcon(PM);  

  

                           if ((applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==ApplicationInfo.FLAG_SYSTEM){  

                               processInfo.isSystem=true;  

                           }else {  

                               processInfo.isSystem=false;  

                           }  

                       } catch (PackageManager.NameNotFoundException e) {  

                           processInfo.name=processInfo.packageName;  

                           processInfo.icon=context.getResources().getDrawable(R.mipmap.ic_launcher);  

                           processInfo.isSystem=true;  

                           e.printStackTrace();  

                       }  

                       processInfoList.add(processInfo);  

                   }  

               }  

           }  

       }  

  

       return processInfoList;  

   }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: