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所以这里就不介绍实现方式了。希望这篇文章对你有所帮助。有什么问题可以留言在下方。
Android开发之获取系统所有进程信息。的更多相关文章
- Android 5.0以上获取系统运行进程信息
在Android 5.0以上系统,调用getRunningAppProcesses 方法返回的列表为空,这是因为谷歌考虑到安全原因,已经把这个方法移除掉了, 那以后要获取系统运行的后台进程这个方法用不 ...
- Android开发之获取手机SIM卡信息
TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设 ...
- Android开发之获取系统版本号
获取系统版本号:获取当前系统的版本号: textView.setText("Product Model: " + android.os.Build.MODEL + ",& ...
- Android开发之获取设备的屏幕信息和px dp之间的转换
DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metr ...
- C/C++通过WMI和系统API函数获取获取系统硬件配置信息
转载:http://www.cnblogs.com/renyuan/archive/2012/12/29/2838716.html 转载:http://blog.csdn.net/jhqin/arti ...
- python获取系统内存占用信息的实例方法
psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...
- Delphi编程获取系统当前进程、窗口句柄、文件属性以(转)
Delphi编程获取系统当前进程.窗口句柄.文件属性以及程序运行状态. uses TLHelp32,PsAPI; (1)显示进程列表:procedure TForm1.Button2Click(Sen ...
- Android开发之获取xml文件的输入流对象
介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...
- System.getProperty()获取系统的配置信息
原文地址:http://www.jsjtt.com/java/Javajichu/105.html 此处记录备用. 1. 通过System.getProperty()可以获取系统的配置信息,Syste ...
随机推荐
- Nginx安装配置详解
http://nginx.org/download/ 下载对应的Nginx 安装nginx之前需要安装依赖包 yum install gcc gcc-c++ zlib-devel pcre-devel ...
- C# ,asp.net 获取当前,相对,绝对路径
一.C#获取当前路径的方法: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...
- 在Windows中配置Rsync同步
Rsync是一款不错的文件免费同步软件,可以镜像保存整个目录树和文件系统,同时保持原来文件的权限.时间.软硬链接.第一次同步时 rsync 会复制全部内容,下次只传输修改过的文件部分.传输数据过程中可 ...
- 20155224 2016-2017-2 《Java程序设计》第8周学习总结
20155224 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 第十四章 NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以设定缓冲区 ...
- test20181018 B君的第一题
题意 分析 考场爆零做法 考虑dp,用\(f(i,j,0/1)\)表示i及其子树中形成j个边连通块的方案数,其中i是否向外连边. \(O(n^3)\),转移方程太复杂就打挂了. #include< ...
- 为已编译的DLL附带强命名
在我们开发的过程中,会经常调用其他人写好的DLL类库,由于种种的原因,不管是公司规定,还是个人习惯等等的原因,有时候需要调用各个类库直接邀请必须强命名. 但是我们临时也无法找到源代码进行重新编译等事情 ...
- eclipse工程 'cocostudio/CocoStudio.h' file not found
android.mk里有这样配置: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) $(call import-add-path,$(LOCAL_ ...
- logback日志分开纪录
LogBack 日志 文件分开纪录 在处理Log中,我们一般讲Log分为一下几类,Debug类型,Error类型,Info类型 等等.. 那么使用LogBack如何分开日志处理 代码如下: 当然也可以 ...
- Phonegap 通知 Notification
通知 Notification 一.notification.alert 对话框 notification.alert 响铃 notification.beep 震动 notification.vib ...
- unity里面的gameobject和transform的关系
一切都是物体(gameobject),而transform是物体的一个基本属性类,包含位置,旋转,缩放,三个基本属性,两者之间可以互相转换 查找物体,建议用transform,GameObject无法 ...