Android进程管理学习

Android获取和清理系统进程

最近在做一个项目,其中需要用到系统的进程管理,对于刚刚进入android的小白来说是有一定的难度的,所以我各种在网上查找资料,整理了一下,做了一个小项目,管理系统进程的。

这里需要用到系统的activityManager和packageManager类,activityManager用来获取正在运行的进程,packageManager用来获取当前进程对应包的详细信息,例如图标,名字等等。

如何来获取系统进程并且得到信息显示出来呢?
通过这个方法来获取系统的服务来得到activityManager:
activityManager=(ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);
然后使用activityManager.getRunningAppProcesses();来得到正在运行的app进程,它返回一个集合List。在这个集合中可以读取到进程的id和内存大小等,得到内存的代码是
MemoryInfo[] memoryInfo = activityManager.getProcessMemoryInfo(pid);
但是得到这些还不够,因为这些如果需要显示出来的话用户是看不懂的,所以需要转化为用户可以看懂的形式,所以就用到了packageManager这个类了,具体实现代码如下:

 public List<ProcessInfo> getRunningAppProInfos() {
        infos = activityManager.getRunningAppProcesses();
        // 通过infos来获取信息,并将有用的信息返回
        List<ProcessInfo> processInfos = new ArrayList<ProcessInfo>();
        // 循环来得到所有进程
        for (int i = 0; i < infos.size(); i++) {
            try {
                // 得到每个进程的ID
                int[] pid = new int[] { infos.get(i).pid };
                int uid = infos.get(i).uid;
                String processName = infos.get(i).processName;
                ProcessInfo processInfo = new ProcessInfo(pid[0], processName, uid);
                ApplicationInfo appInfo = packageManager.getApplicationInfo(infos.get(i).processName, 0);
                // 判断这个应用的进程是否为系统进程,等于0就不是系统进程就添加,否则不添加
                if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {

                    // 得到内存信息
                    MemoryInfo[] memoryInfo = activityManager.getProcessMemoryInfo(pid);
                    // 得到当前进程所用的内存
                    long proMemory = memoryInfo[0].dalvikPrivateDirty;
                    // 格式化为我需要的形式,并放到实体类中
                    String size = Format.changeByteFormat(proMemory);
                    Drawable icon = appInfo.loadIcon(packageManager);
                    String name = appInfo.loadLabel(packageManager).toString();
                    processInfo.setpIcon(icon);
                    processInfo.setAppName(name);
                    processInfo.setpSize(size);

                    processInfos.add(processInfo);
                }
            } catch (NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        return processInfos;
    }

这里的processInfos是我自己创建的进程实体类,用于存储有用的信息。
下面说说杀死进程的方法:它需要系统的权限才能实现
需要的权限:Android.permission.KILL_BACKGROUND_PROCESSES。但使用此方法杀死进程后,进程会重启,为了强制关闭进程,使用ActivityManager的另外一个方法,forceStopPackage,但是这个方法无法直接调用,因为是@hide的方法,所以只能通过反射机制来调用这个方法。

 /**
     * 杀死某一个进程
     */
    public long killPro(String processName) {
        long beforeMem = getMemory();
        String packageName = null;
        try {
            if (processName.indexOf(":") == -1) {
                packageName = processName;
            } else {
                packageName = processName.split(":")[0];
            }
            if (isProcessExisting(packageName)) {
                activityManager.killBackgroundProcesses(packageName);
            }

            Method forceStopPackage = activityManager.getClass().getDeclaredMethod("forceStopPackage", String.class);
            forceStopPackage.setAccessible(true);
            forceStopPackage.invoke(activityManager, packageName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        long overMem = getMemory();
        return overMem - beforeMem;
    }

这里是杀死某一个进程的大致逻辑
还有一个是杀死所有可以被杀死的进程的实现

 /**
     * 杀死所有进程
     * 
     * @return 清理的内存
     */
    public long killAllPro() {
        long beforeMem = getMemory();
        for (ActivityManager.RunningAppProcessInfo infos : getInfos()) {
            if (infos.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
                String[] pkgList = infos.pkgList;
                for (String name : pkgList) {
                    if (isProcessExisting(name)) {
                        activityManager.killBackgroundProcesses(name);
                    }
                }
            }
        }

        long overMem = getMemory();
        return overMem - beforeMem;
    }

以上就是我刚刚学习到的进程管理的部分知识,我还是个android小白,希望能交到一些android大神来交流沟通n(≧▽≦)n

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值