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

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

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

  1. public static long getTotalMemSize() {
  2. long size=0;
  3. File file = new File("/proc/meminfo");
  4. try {
  5. BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
  6. String memInfo = buffer.readLine();
  7. int startIndex = memInfo.indexOf(":");
  8. int endIndex = memInfo.indexOf("k");
  9. memInfo = memInfo.substring(startIndex + 1, endIndex).trim();
  10. size = Long.parseLong(memInfo);
  11. size *= 1024;
  12. buffer.close();
  13. } catch (java.io.IOException e) {
  14. e.printStackTrace();
  15. }
  16. return size;
  17. }
  18.  
  19. public static long getAviableMemSize() {
  20. long size=0;
  21. File file = new File("/proc/meminfo");
  22. try {
  23. BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
  24. String memInfos=new String();
  25. int i=0;
  26. while ((memInfos=buffer.readLine())!=null){
  27. i++;
  28. if (i==2){
  29. memInfo = memInfos;
  30. }
  31.  
  32. }
  33. int startIndex = memInfo.indexOf(":");
  34. int endIndex = memInfo.indexOf("k");
  35. memInfo = memInfo.substring(startIndex + 1, endIndex).trim();
  36. size = Long.parseLong(memInfo);
  37. size *= 1024;
  38. buffer.close();
  39. } catch (java.io.IOException e) {
  40. e.printStackTrace();
  41. }
  42.  
  43. return size;
  44. }

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

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

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

  1. public static List<TaskBean> getAllTask() {
  2. List<TaskBean>taskList=new ArrayList<>();
  3. List<ActivityManager.RunningAppProcessInfo>runList=UIUtils.getActManager().getRunningAppProcesses();
  4. try {
  5. for (ActivityManager.RunningAppProcessInfo r:runList) {
  6. TaskBean taskBean = new TaskBean();
  7. String processName = r.processName;
  8. taskBean.setPackageName(processName);
  9. PackageInfo packageInfo = UIUtils.getPacManager().getPackageInfo(processName, 0);
  10. taskBean.setIcon(packageInfo.applicationInfo.loadIcon(UIUtils.getPacManager()));
  11. taskBean.setName(packageInfo.applicationInfo.loadLabel(UIUtils.getPacManager()).toString());
  12. Debug.MemoryInfo[] processInfo=UIUtils.getActManager().getProcessMemoryInfo(new int[]{r.pid});
  13. taskBean.setMemSize(processInfo[0].getTotalPrivateDirty()*1024);
  14. if ((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)!=0){
  15. taskBean.setSystem(true);
  16. }else {
  17. taskBean.setUser(true);
  18. }
  19. if (taskList != null) {
  20. taskList.add(taskBean);
  21. for (int i=0;i<taskList.size();i++) {
  22. if (taskList.get(i).getPackageName().equals(Constants.PACKAGE_INFO)){
  23. taskList.remove(i);
  24. }
  25. }
  26. }
  27. }
  28. } catch (PackageManager.NameNotFoundException e) {
  29. e.printStackTrace();
  30. }
  31.  
  32. return taskList;
  33. }

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

  1. public static List<TaskBean> getTaskInfos() {
  2. List<AndroidAppProcess> processInfos = ProcessManager.getRunningAppProcesses();
  3.  
  4. List<TaskBean> taskinfos = new ArrayList<TaskBean>();
  5. // 遍历运行的程序,并且获取其中的信息
  6. for (AndroidAppProcess processInfo : processInfos) {
  7. TaskBean taskinfo = new TaskBean();
  8. // 应用程序的包名
  9. String packname = processInfo.name;
  10. taskinfo.setPackageName(packname);
  11. // 湖区应用程序的内存 信息
  12. android.os.Debug.MemoryInfo[] memoryInfos = UIUtils.getActManager()
  13. .getProcessMemoryInfo(new int[] { processInfo.pid });
  14. long memsize = memoryInfos[0].getTotalPrivateDirty() * 1024L;
  15. taskinfo.setMemSize(memsize);
  16. taskinfo.setPackageName(processInfo.getPackageName());
  17. try {
  18. // 获取应用程序信息
  19. ApplicationInfo applicationInfo = UIUtils.getPacManager().getApplicationInfo(
  20. packname, 0);
  21. Drawable icon = applicationInfo.loadIcon(UIUtils.getPacManager());
  22. taskinfo.setIcon(icon);
  23. String name = applicationInfo.loadLabel(UIUtils.getPacManager()).toString();
  24. taskinfo.setName(name);
  25.  
  26. if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
  27. // 用户进程
  28. taskinfo.setUser(true);
  29. } else {
  30. // 系统进程
  31. taskinfo.setSystem(true);
  32. }
  33. } catch (PackageManager.NameNotFoundException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. // 系统内核进程 没有名称
  37. taskinfo.setName(packname);
  38. Drawable icon = UIUtils.getContext().getResources().getDrawable(
  39. R.drawable.ic_launcher);
  40. taskinfo.setIcon(icon);
  41. }
  42. if (taskinfo != null) {
  43. taskinfos.add(taskinfo);
  44. for (int i=0;i<taskinfos.size();i++) {
  45. if (taskinfos.get(i).getPackageName().equals(Constants.PACKAGE_INFO)){
  46. taskinfos.remove(i);
  47. }
  48. }
  49. }
  50. }
  51. return taskinfos;
  52. }

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

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

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

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

  1. Android 5.0以上获取系统运行进程信息

    在Android 5.0以上系统,调用getRunningAppProcesses 方法返回的列表为空,这是因为谷歌考虑到安全原因,已经把这个方法移除掉了, 那以后要获取系统运行的后台进程这个方法用不 ...

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

    TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设 ...

  3. Android开发之获取系统版本号

    获取系统版本号:获取当前系统的版本号: textView.setText("Product Model: " + android.os.Build.MODEL + ",& ...

  4. Android开发之获取设备的屏幕信息和px dp之间的转换

    DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metr ...

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

    转载:http://www.cnblogs.com/renyuan/archive/2012/12/29/2838716.html 转载:http://blog.csdn.net/jhqin/arti ...

  6. python获取系统内存占用信息的实例方法

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...

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

    Delphi编程获取系统当前进程.窗口句柄.文件属性以及程序运行状态. uses TLHelp32,PsAPI; (1)显示进程列表:procedure TForm1.Button2Click(Sen ...

  8. Android开发之获取xml文件的输入流对象

    介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...

  9. System.getProperty()获取系统的配置信息

    原文地址:http://www.jsjtt.com/java/Javajichu/105.html 此处记录备用. 1. 通过System.getProperty()可以获取系统的配置信息,Syste ...

随机推荐

  1. Nginx安装配置详解

    http://nginx.org/download/ 下载对应的Nginx 安装nginx之前需要安装依赖包 yum install gcc gcc-c++ zlib-devel pcre-devel ...

  2. C# ,asp.net 获取当前,相对,绝对路径

    一.C#获取当前路径的方法: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...

  3. 在Windows中配置Rsync同步

    Rsync是一款不错的文件免费同步软件,可以镜像保存整个目录树和文件系统,同时保持原来文件的权限.时间.软硬链接.第一次同步时 rsync 会复制全部内容,下次只传输修改过的文件部分.传输数据过程中可 ...

  4. 20155224 2016-2017-2 《Java程序设计》第8周学习总结

    20155224 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 第十四章 NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以设定缓冲区 ...

  5. test20181018 B君的第一题

    题意 分析 考场爆零做法 考虑dp,用\(f(i,j,0/1)\)表示i及其子树中形成j个边连通块的方案数,其中i是否向外连边. \(O(n^3)\),转移方程太复杂就打挂了. #include< ...

  6. 为已编译的DLL附带强命名

    在我们开发的过程中,会经常调用其他人写好的DLL类库,由于种种的原因,不管是公司规定,还是个人习惯等等的原因,有时候需要调用各个类库直接邀请必须强命名. 但是我们临时也无法找到源代码进行重新编译等事情 ...

  7. eclipse工程 'cocostudio/CocoStudio.h' file not found

    android.mk里有这样配置: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) $(call import-add-path,$(LOCAL_ ...

  8. logback日志分开纪录

    LogBack 日志 文件分开纪录 在处理Log中,我们一般讲Log分为一下几类,Debug类型,Error类型,Info类型 等等.. 那么使用LogBack如何分开日志处理 代码如下: 当然也可以 ...

  9. Phonegap 通知 Notification

    通知 Notification 一.notification.alert 对话框 notification.alert 响铃 notification.beep 震动 notification.vib ...

  10. unity里面的gameobject和transform的关系

    一切都是物体(gameobject),而transform是物体的一个基本属性类,包含位置,旋转,缩放,三个基本属性,两者之间可以互相转换 查找物体,建议用transform,GameObject无法 ...