Android6.0獲取進程和進程數目的方法:

Android5.0之後使用

ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
//獲取進程的集合
runningAppProcesses= activityManager.getRunningAppProcesses();
size = runningAppProcesses.size();
這種方法獲取進程數,已經不可能了android開發越來越艱難,前天寫進程管理的代碼。在這裏加以總結

1.若用戶未開啓權限,需要先開啓權限:

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.提供的方法的集合

 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;
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章