Android开发之获取系统所有进程信息。

最近在做一个app,有一个进程管理模块用于管理系统中正在运行的进程,并且可以关闭进程进行加速手机的功能,基本把它实现了出来。界面的效果都是自己写的,虽然有BUG,但是基本上能满足需求,后期我会改进BUG。好了,来看看效果:

1.获取系统的可用内存和总内存。

获取系统内存中应用的信息,需要用到ActivityManager这个类,然而当你用这个类拿数据的时候你会发现,拿到的数据不正确。用这个类的API获取系统的总内存和可用内存会出现数据不正确的情况。除了这个类,Android手机中有文件描述了这些信息——/proc/meminfo。meminfo文件中详细的记录了安卓手机的一些数据,包括可用内存和总内存。附上代码:

 public static long getTotalMemSize() {
        long size=0;
        File file = new File("/proc/meminfo");
        try {
            BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
            String memInfo = buffer.readLine();
            int startIndex = memInfo.indexOf(":");
            int endIndex = memInfo.indexOf("k");
            memInfo = memInfo.substring(startIndex + 1, endIndex).trim();
            size = Long.parseLong(memInfo);
            size *= 1024;
            buffer.close();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
        return size;
    }

    public static long getAviableMemSize() {
        long size=0;
        File file = new File("/proc/meminfo");
        try {
            BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
             String memInfos=new String();
            int i=0;
            while ((memInfos=buffer.readLine())!=null){
               i++;
                if (i==2){
                    memInfo = memInfos;
                }

            }
            int startIndex = memInfo.indexOf(":");
            int endIndex = memInfo.indexOf("k");
            memInfo = memInfo.substring(startIndex + 1, endIndex).trim();
            size = Long.parseLong(memInfo);
            size *= 1024;
            buffer.close();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }

        return size;
    }

操作很简单分别是读取第一行的数据和第二行的数据,将字符串分去出,将所得值乘以1024变为byte类型。

2.获取内存中运行应用的信息

首先,自然要有一个Bean文件用于存储这些信息,之后通过ActivityManager的getRunningAppProcesses()方法得到一个RunningAppProcessInfo的List。便利这个List去除我们想要的数据,存在我们的Bean文件夹中。

  public static List<TaskBean> getAllTask() {
        List<TaskBean>taskList=new ArrayList<>();
        List<ActivityManager.RunningAppProcessInfo>runList=UIUtils.getActManager().getRunningAppProcesses();
        try {
            for (ActivityManager.RunningAppProcessInfo r:runList) {
                TaskBean taskBean = new TaskBean();
                String processName = r.processName;
                taskBean.setPackageName(processName);
                PackageInfo packageInfo = UIUtils.getPacManager().getPackageInfo(processName, 0);
                taskBean.setIcon(packageInfo.applicationInfo.loadIcon(UIUtils.getPacManager()));
                taskBean.setName(packageInfo.applicationInfo.loadLabel(UIUtils.getPacManager()).toString());
                Debug.MemoryInfo[] processInfo=UIUtils.getActManager().getProcessMemoryInfo(new int[]{r.pid});
                taskBean.setMemSize(processInfo[0].getTotalPrivateDirty()*1024);
                if ((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)!=0){
                    taskBean.setSystem(true);
                }else {
                    taskBean.setUser(true);
                }
                if (taskList != null) {
                    taskList.add(taskBean);
                    for (int i=0;i<taskList.size();i++) {
                        if (taskList.get(i).getPackageName().equals(Constants.PACKAGE_INFO)){
                            taskList.remove(i);
                        }
                    }
                }
            }
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }

        return taskList;
    }

好了,大功告成。当你开开心心的拿到手机上调试的时候你会发现,一个数据都没有。原来,在Android5.0之后,谷歌处于完全考虑已经弃用了通过如上方法拿到进程中的信息。那么又应该怎么做呢?

 public static List<TaskBean> getTaskInfos() {
        List<AndroidAppProcess> processInfos = ProcessManager.getRunningAppProcesses();

        List<TaskBean> taskinfos = new ArrayList<TaskBean>();
        // 遍历运行的程序,并且获取其中的信息
        for (AndroidAppProcess processInfo : processInfos) {
            TaskBean taskinfo = new TaskBean();
            // 应用程序的包名
            String packname = processInfo.name;
            taskinfo.setPackageName(packname);
            // 湖区应用程序的内存 信息
            android.os.Debug.MemoryInfo[] memoryInfos = UIUtils.getActManager()
                    .getProcessMemoryInfo(new int[] { processInfo.pid });
            long memsize = memoryInfos[0].getTotalPrivateDirty() * 1024L;
            taskinfo.setMemSize(memsize);
            taskinfo.setPackageName(processInfo.getPackageName());
            try {
                // 获取应用程序信息
                ApplicationInfo applicationInfo = UIUtils.getPacManager().getApplicationInfo(
                        packname, 0);
                Drawable icon = applicationInfo.loadIcon(UIUtils.getPacManager());
                taskinfo.setIcon(icon);
                String name = applicationInfo.loadLabel(UIUtils.getPacManager()).toString();
                taskinfo.setName(name);

                if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
                    // 用户进程
                    taskinfo.setUser(true);
                } else {
                    // 系统进程
                    taskinfo.setSystem(true);
                }
            } catch (PackageManager.NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                // 系统内核进程 没有名称
                taskinfo.setName(packname);
                Drawable icon = UIUtils.getContext().getResources().getDrawable(
                        R.drawable.ic_launcher);
                taskinfo.setIcon(icon);
            }
            if (taskinfo != null) {
                taskinfos.add(taskinfo);
                for (int i=0;i<taskinfos.size();i++) {
                    if (taskinfos.get(i).getPackageName().equals(Constants.PACKAGE_INFO)){
                        taskinfos.remove(i);
                    }
                }
            }
        }
        return taskinfos;
    }

好了,接下来只需要判断安装的版本就可以了:

int sysVersion = Integer.parseInt(Build.VERSION.SDK);
taskList = sysVersion > 21 ? TaskManagerEngine.getTaskInfos() : TaskManagerEngine.getAllTask();

好了,大功告成。数据就能正常拿到了。关于这个效果,我实现下来比较复杂,用了属性动画和补间动画,依赖于Material Design,封装的不是很好,也有BUG所以这里就不介绍实现方式了。希望这篇文章对你有所帮助。有什么问题可以留言在下方。

时间: 2024-11-03 22:15:42

Android开发之获取系统所有进程信息。的相关文章

Android开发之获取系统12/24小时制的时间

//通过DateFormat获取系统的时间 String currentTime=DateFormat.format("yyyy-MM-dd hh-mm-ss", new Date()).toString(); currentTime="通过DateFormat获取的时间:\n"+currentTime; //通过SimpleDateFormat获取24小时制时间 SimpleDateFormat sdf=new SimpleDateFormat("yyy

Android开发之获取手机SIM卡信息

TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设备上的电话服务信息. 应用程序能够使用这个类的方法来确定电话服务和状态,以及訪问某些类型的用户信息.应用程序还能够注冊一个侦听器以接收的电话状态变化通知. 你不能直接实例化这个类;相反,你能够通过Context.getSystemService(Context.TELEPHONY_SERVICE)方

Android开发之获取设备的屏幕信息

1 DisplayMetrics metric = new DisplayMetrics(); 2 getWindowManager().getDefaultDisplay().getMetrics(metric); 3 int width = metric.widthPixels; // 屏幕宽度(像素) 4 int height = metric.heightPixels; // 屏幕高度(像素) 5 float density = metric.density; // 屏幕密度(0.75

C/C++通过WMI和系统API函数获取获取系统硬件配置信息

转载:http://www.cnblogs.com/renyuan/archive/2012/12/29/2838716.html 转载:http://blog.csdn.net/jhqin/article/details/5548656 转载:http://blog.csdn.net/dongdan_002/article/details/42460343 头文件WMIInfo.h 1 /*****************************************************

[转载]如何使Android应用程序获取系统权限来修改系统时间

在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行与系统进程中才可以用. 本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的. 第一个方法简单点,不过需要在

获得Gnu/Linux系统与进程信息

这里主要介绍/proc伪文件系统及uname()函数来获取系统或进程的一些信息. /proc文件系统介绍 在早期的UNIX发行版中,并不能很容易的分析内核的一些属性,并且很难回答以下问题: 系统有多少进程正在运行,并且谁拥有这些进程? 一个进程都打开了哪些文件? 哪些文件目前被锁住了,并且哪些进程拥有这些文件锁? 系统有哪些套接字正在使用? 一些早期的UNIX发行版解决该问题是允许有权限的程序进入内核的内存空间的数据结构中.这样的解决办法有诸多不便.然而,最蛋疼的是它需要程序员了解的内核中的数据

Android开发之清理系统缓存错误

最近在做清理系统缓存功能时,用到以下方法 PackageManager pm = context.getPackageManager(); Method localMethod = pm.getClass().getMethod("freeStorageAndNotify", Long.TYPE, IPackageDataObserver.class); Long localLong = Long.valueOf(getEnvironmentSize() - 1L); Object[]

Android中StatFs获取系统/sdcard存储(剩余空间)大小

package com.orgcent.util; import java.io.File; import android.os.Environment; import android.os.StatFs; public class MemoryStatus { static final int ERROR = -1; /** * 外部存储是否可用 * @return */ static public boolean externalMemoryAvailable() { return andr

Delphi编程获取系统当前进程、窗口句柄、文件属性以(转)

Delphi编程获取系统当前进程.窗口句柄.文件属性以及程序运行状态. uses TLHelp32,PsAPI; (1)显示进程列表:procedure TForm1.Button2Click(Sender: TObject);var lppe: TProcessEntry32;found : boolean;Hand : THandle;P:DWORD;s:string;beginListBox1.Items.Clear ;Hand := CreateToolhelp32Snapshot(TH