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所以这里就不介绍实现方式了。希望这篇文章对你有所帮助。有什么问题可以留言在下方。

转载于:https://www.cnblogs.com/lovelyYakir/p/5886961.html

c语言串口编程详解 串口: 一种异步通信接口,通常用于低速数据传输。RS-232: 最常见的串口标准,定义了电气特性、连接器和信号线。UART: 通用异步收发传输器,是实现串口通信的硬件模块。通过以上内容,你应能够理解并实现C语言在Windows和Linux平台上的串口编程。希望这本手册能帮助你在实际项目中顺利进行串口通信开发。如果有任何疑问或需要进一步的帮助,请随时提问。 阅读详情

相关推荐

Mask2Former实战:用SwinTransformer+Deformable Attention搞定图像分割三大任务

本文实战解析了Mask2Former模型如何统一解决语义、实例和全景分割三大任务。通过集成Swin Transformer骨干网络与创新的Deformable Attention及Masked Attention机制,详细介绍了模型构建、训练策略及在COCO数据集上的性能表现,为开发者提供了高效的图像分割解决方案。

tech5的博客 246

Android 5.0系统以上获取所有运行进程

在Android 5.0系统以上,调用getRunningAppProcesses() 方法来获取所有运行的进程是获取不到的,因为谷歌出于安全的考虑,所以在5.0系统以上把这个方法移除了。那么我们又该如何去获取呢?不要急,大家先看看下面一个demo的源码。不过值得注意的是,下面这种方式只适合用于5.0系统以上,以下同样也是获取不到的。以下的直接调用getRunningAppProcesses(

丿灬安之若死 3158

Seedance2.5本地部署:从环境配置到批量生图的工程实践指南

最近在几个技术社群里,看到不少人在讨论 AI 生图和视频工具。有人抱怨在线服务要么贵、要么慢、要么生成内容受限;也有人尝试了各种“免费”方案,结果不是功能残缺就是暗藏收费陷阱。就在大家觉得“又好又免费”的本地部署方案门槛太高时,Seedance2.5 突然冒了出来,而且口号相当直接:本地部署、完全免费、不联网、功能对标甚至超越一些付费产品。 但这类宣传我们见多了,真正的问题是:它到底能不能在普通开发者的机器上跑起来?生成质量是否真的可用?长期使用会不会遇到模型崩溃、依赖冲突或者资源爆炸?更重要的是,对于一个

weixin_27419879的博客 1129

Android获取当前运行的所有进程任务

需求: 游戏中要做反外挂处理,尤其是针对按键精灵等挂机软件,不管是真机还是模拟器都有玩家使用挂机软件。 测试过程: 1.参考 https://blog.youkuaiyun.com/cbbbc/article/details/59058140 2.下载Sample GitHub项目在这里. 3.新建AndroidStudio Demo测试,此处使用的AS版本为3.2. 4.导入下载的Sample里...

逍遥游侠的博客 8233

保姆级教程:在RK3588开发板上用CMake交叉编译ZLMediaKit(附完整toolchain配置)

本文提供了一份详细的RK3588开发板上使用CMake交叉编译ZLMediaKit的教程,包括完整的toolchain配置和实战避坑指南。从环境准备、工具链配置到依赖处理、编译部署,手把手指导开发者完成ARM64架构的流媒体服务搭建,特别适合嵌入式开发新手。

weixin_28681255的博客 383

用Python+LLM实现小说自动转剧本:从爬取到生成的完整实战指南(附GitHub源码)

本文提供了一份完整的实战指南,详细介绍了如何利用Python和大语言模型(LLM)构建一个自动化的小说转剧本工具。文章从网络爬虫获取文本开始,逐步讲解了使用LLM进行智能解析与结构化、集成专业模型进行情绪分析与动作生成,最终合成并输出格式规范的剧本文档。通过模块化架构设计和附带的GitHub源码,帮助开发者掌握从数据获取到内容生成的全流程,实现高效的小说剧本转换器。

xray4的博客 413

Android中getSystemService介绍,获取系统的运行状态,判断当前网络状态

在Android后台运行着很多service,他们在系统启动是通过SystemService开启,支持系统的正常工作,也帮助我们更好的实现各种功能。 getSystemService是activity的一个方法,通过context进行调用,通过不同的服务名获得相应的服务对象,再根据获得的对象调用所需要的方法一下是一些服务的名称以及返回对象                     传

小杨的博客 1263

应急响应之windows日志分析工具logparser使用

windows日志分析工具logparser使用介绍

u013930899的博客 8124

Android中获取进程的有关信息

android进程信息 应用程序内存

wuyinlei的博客 7978

uniapp 开发小程序 使用 `uni.canvasToTempFilePath` 导出图片时遇到的 “fail fail canvas is empty“ 错误解决方法

问题的关键在于,在调用时需要正确的上下文对象。如果没有传入this(vue2)或instance(vue3),就会导致导出失败,提示错误。这也提醒我们,在使用类似这样的 API 时,要确保上下文传递正确,以便函数能够正常执行。希望这个排查过程和解决方案能帮助你解决类似的问题!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2331

Android 获取进程名

/ processName 即为进程名。// processName 即为进程名。

weixin_42707424的博客 1928

信捷PLC XD5系列运动控制(10轴)编程应用篇

项目PLC采用XD5-60T10-E,36DI 24DO 晶体管输出,支持10路脉冲输出功能。TMR指令定时器时基可以自己设定,这点比其他品牌PLC方便。ZRN指令我们需要上升沿指令触发。 5、变址寻址 该说不说这个变址寻址是真的强,比西门子指针、三菱的变址寄存器Z 、V都要更加灵活。 7、特殊寄存器:时钟 8、如何建立PLC通讯...............

RXXW_Dor的博客 1万+

android+内存填充方法,Android获得内存信息

在Android中,想要获得进程内存信息,有两类方法1.exec大法,使用Runtime.getRuntime().exec()方法来执行命令行,主要命令行有 dumpsys(需要system权限) cat /proc等private String catProc() {StringBuilder meminfo = new StringBuilder();try {ArrayList comm...

weixin_34840249的博客 426

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android系统安全权限

proc:一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状;存储与进程、文件系统、设备等相关的数据,在反入侵当中该目录也很关键的一种手段,例如检测系统是否被提权,可以通过父子进程的uid关系来判断(单一的判断会存在许多误报问题,需综合来检测)以及检测进程注入可以监测/proc下的进程UID、PID信息,如果发现进程的PID或UID有修改,则存在提权行为等。

m0_69474214的博客 853

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)

本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等、应用程序/包、服务(Service)、任务(Task)信息。 计划如下: 第一部分:获取系统可用内存以及所...

weixin_30583563的博客 83

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android开发之获取当前进程的信息的集合

Android开发之获取当前进程的信息的集合Android开发对于大家来说越来越接近。我们不用只局限于使用别人开发的应用。在开发部分手机卫士等类型的app时,肯定要获取到当前所有运行的进程 。并且区分是系统进程还是用户进程,并且获取应用的信息。思路:1、通过ActivityManager.getRunningAppProcesses()获取正在运行的进程 2、得到应用的ApplicationIn

ThisLX的博客 2187

Android - 安装及卸载应用,启动应用程序,分享,详细信息,设备进程信息获取,获取进程占用RAM,清理进程

方法三:使用普通for循环倒叙,可在遍历中删除。注意:如不采用倒叙,会遍历不全i >= 0;i–) {break;

2401_84132393的博客 854

Android中获取系统内存信息以及进程信息-----ActivityManager的使用

本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括      进程(Process)等、应用程序/包、服务(Service)、任务(Task)信息。                 计划如下:                   第一部分:获取系统可用内存以及所有的正在运行的进程信息;

xu_song的专栏 444

android 判断是否为系统进程

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1Android 判断是否为系统进程的方法 在Android开发中,判断一个进程是否为系统进程是一个常见的需求。本文将引导你通过简单的步骤来实现这一功能。我们将使用Java来编写代码,并附上...

weixin_31510897的博客 211

在android中获取系统正在运行的进程

[code="java"] public String getRunningProcesses(){ ActivityManager _ActivityManager = (ActivityManager) this .getSystemService(Context.ACTIVITY_SERVICE); //获取系统的全局状态 List list = _Act...

Beaver‘s 370

【详解】Android杀死选中的进程释放进程占用的空间

在Android开发中,管理和优化应用的性能是一个重要的课题。特别是在资源管理方面,如何有效地管理进程,确保应用在运行时能够合理利用系统资源,是开发者需要关注的问题之一。本文将介绍如何在Android中杀死选中的进程,从而释放进程占用的空间,提高应用的运行效率。需要注意的是,从Android 5.0(API级别21)开始,系统对应用程序的后台进程管理变得更加严格,因此直接杀死其他应用的进程可能会受到限制,尤其是对于非系统应用。通过这些方法,你可以更有效地管理应用的内存使用,提高应用的稳定性和性能。

牛肉胡辣汤 1247

android上获取设备的信息,Android开发之获取设备的屏幕信息和px dp之间的转换

DisplayMetrics metric = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metric);int width = metric.widthPixels; // 屏幕宽度(像素)int height = metric.heightPixels; // 屏幕高度(像素)float d...

weixin_28630185的博客 283
上一篇: Android开发之通过包管理器获取安装应用信息
下一篇: Android给ListView添加一个入场动画
diebing0439
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值