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

2024-06-18 02:48

本文主要是介绍Android中获取系统内存信息以及进程信息-----ActivityManager的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括进程(Process)等、应用程序/包、服务(Service)、任务(Task)信息。

 计划如下:

第一部分:获取系统可用内存以及所有的正在运行的进程信息;

        第二部分:获取每个进程里运行的应用程序信息和所有正在运行的应用程序

        第三部分:获取正在运行的服务和任务信息。

       

                每部分都准备了相应的Demo,助您更深的理解.

          

        知识准备:Android 应用程序模块: 应用、任务、进程的知识介绍:

            1  一个android 包(简称.apk) :里面包含应用程序的代码以及资源。这是一个应用发布,用户能下载并安装他们

              设备上的文件。

            2  一个 任务 :通常用户能当它为一个“应用程序”来启动:通常在桌面上会有一个图标可以来启动任务,这是一个

              上层的应用,可以将你的任务切换到前台来。

            3  一个 进程 :是一个底层的代码运行级别的核心进程。通常.apk包里所有代码运行在一个进程里,一个进程对于

              一个.apk包;然而,进程 标签常用来改变代码运行的位置,可以是全部的.apk包 或者是独立的活动,接收器,服务, 或者

                 提供器组件。

  进程

         在Android中,进程是应用程序的完整实现,而不是用户通常了解的那样。他们主要用途很简单:

            1、提高稳定性和安全性,将不信任或者不稳定的代码移动到其他进程。

            2、可将多个.apk包运行在同一个进程里减少系统开销。

            3、帮助系统管理资源,将重要的代码放在一个单独的进程里,这样就可以单独销毁应用程序的其他部分。

         于是,为了完成某一任务或者减少系统资源的开销,一个进程里可以运行一个或多个应用程序。

    

    更多知识点获取,请访问:《Android 应用程序模块: 应用, 任务, 进程, 和线程》

 

 

ActivityManager 类:

             获取方法ActivityManager mActivityManager (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

          常用的静态内部类如下(下面具体介绍):

                     ActivityManager.MemoryInfo: 系统可用内存信息

                      ActivityManager.RecentTaskInfo: 最近的任务信息

                      ActivityManager.RunningAppProcessInfo: 正在运行的进程信息

                      ActivityManager.RunningServiceInfo: 正在运行的服务信息

                      ActivityManager.RunningTaskInfo: 正在运行的任务信息

 常用方法:

public void getMemoryInfo(ActivityManager.MemoryInfo outInfo)

                说明:获取系统可用内存信息,数据封装在outInfo对象上

public Debug.MemoryInfo getProcessMemoryInfo(int[ ] pids

     说明:获取每个进程ID(集合)占用的内存大小(集合), pid和MemoryInfo是一一对应的。

     参数:pids 进程ID的集合           

PS :我们可以通过调用Debug.MemoryInfo 的dalvikPrivateDirty字段获取进程占用的内存大小(单位为KB)

 

 public List<ActivityManager.RunningAppProcessInfo>getRunningAppProcess()

    说明: 获取系统里正在运行的进程

public List<ActivityManager.RunningServiceInfo>getRunningServices(int maxNum)

     说明: 获取系统里所有正在运行的服务        

     参数:可能服务的最大值(赋予一常数即可,20、50都OK)

public List<ActivityManager.RunningTaskInfoo>getRunningTasks(int maxNum)

               说明:获取系统里正在运行的服务

               参数: 同上

public List<ActivityManager.RecentTaskInfo>getRecentTasks(int maxNum, int flags)

             说明:获取系统里最近启动的任务

             参数: 同上,flags一般为0即可

public voidkillBackgroundProcess(String packageName)

            说明:立即杀掉给定包名的进程,释放进程占用的资源(内存等),如果需要,系统会再次重新启动该进程。系统

            PS:系统进程是杀不死的,只能杀死用户进程。但我没有找到好的方法辨别系统进程还是用户进程。但可以肯定的是,

                   能够杀死的一定是用户进程。

          public void restartPackage(String packageName)

            说明:该方法已弃用,等同于killBackgroundProcess 。

 

 

 ActivityManager.MemoryInfo类

    常用字段:

            long availMem 系统可用内存

            long threshold系统内存不足的阀值,即临界值

            boolean lowMemory 如果当前可用内存<=threshold,该值为真

 

ActivityManager.RunningAppProcessInfo类

   常用字段:

          int pid                             进程ID

          int uid                             进程所在的用户ID

          String processName    进程名,默认是包名或者由android:process=””属性指定

          String [ ] pkgList           运行在该进程下的所有应用程序包名

       对ActivityManager.RecentTaskInfo 、ActivityManager.RunningServiceInfo 、ActivityManager.RunningTaskInfo

   类的介绍留在后文介绍。

 

 

DEMO说明:

          我们通过ActivityManager获取了系统的可用内存信息以及正在运行在系统里的进程具体信息,当然你也可以选择

       手动杀死这些进程,不过前提是用户进程,因为系统进程是杀不死的。

 

          模拟器上的截图如下:

 


                         \              \

 

资源文件什么的就不再贴代码了,直接列出逻辑文件。

 

  获取系统可用内存的代码:MainActivity.java

 

package com.qin.ammp; 

 

 

import java.util.ArrayList; 

import java.util.List; 

 

import android.app.Activity; 

import android.app.ActivityManager; 

import android.app.ActivityManager.MemoryInfo; 

import android.content.Context; 

import android.content.Intent; 

import android.os.Bundle; 

import android.os.Debug; 

import android.text.format.Formatter; 

import android.util.Log; 

import android.view.View; 

import android.widget.Button; 

import android.widget.TextView; 

 

public class MainActivity extends Activity { 

     

    private static String TAG = "AM_MEMORYIPROCESS" ; 

     

    private ActivityManager mActivityManager = null ; 

      

    private TextView tvAvailMem  ; 

    private Button btProcessInfo ; 

     

    /** Called when the activity is first created. */ 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.main); 

         

        tvAvailMem = (TextView)findViewById(R.id.tvAvailMemory) ; 

        btProcessInfo =(Button)findViewById(R.id.btProcessInfo); 

        //跳转到显示进程信息界面 

        btProcessInfo.setOnClickListener(new View.OnClickListener() { 

             

            @Override 

            public void onClick(View v) { 

                // TODO Auto-generated method stub 

                Intent intent = new Intent(MainActivity.this,BrowseProcessInfoActivity.class); 

                startActivity(intent); 

            } 

        });                

         

        //获得ActivityManager服务的对象 

        mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 

       

        //获得可用内存信息 

        String availMemStr = getSystemAvaialbeMemorySize(); 

        Log.i(TAG, "The Availabel Memory Size is"+availMemStr);  

        //显示 

        tvAvailMem.setText(availMemStr);  

         

    } 

    //获得系统可用内存信息 

    private String getSystemAvaialbeMemorySize(){ 

        //获得MemoryInfo对象 

        MemoryInfo memoryInfo = new MemoryInfo() ; 

        //获得系统可用内存,保存在MemoryInfo对象上 

        mActivityManager.getMemoryInfo(memoryInfo) ; 

        long memSize = memoryInfo.availMem ; 

         

        //字符类型转换 

        String availMemStr = formateFileSize(memSize); 

         

        return availMemStr ; 

    } 

   

    //调用系统函数,字符串转换long -String KB/MB 

    private String formateFileSize(long size){ 

        return Formatter.formatFileSize(MainActivity.this, size);  

    } 

     

 

获取系统进程信息的代码 :BrowseProcessInfoActivity .java

 

 

package com.qin.ammp; 

 

import java.util.ArrayList; 

import java.util.List; 

 

import android.app.Activity; 

import android.app.ActivityManager; 

import android.app.AlertDialog; 

import android.app.Dialog; 

import android.content.Context; 

import android.content.DialogInterface; 

import android.os.Bundle; 

import android.os.Debug; 

import android.util.Log; 

import android.view.ContextMenu; 

import android.view.Menu; 

import android.view.MenuItem; 

import android.view.View; 

import android.view.ContextMenu.ContextMenuInfo; 

import android.widget.AdapterView; 

import android.widget.ListView; 

import android.widget.TextView; 

import android.widget.AdapterView.OnItemClickListener; 

 

public class BrowseProcessInfoActivity extends Activity  implements OnItemClickListener{ 

 

    private static String TAG = "ProcessInfo"; 

    private static final int KILL_PORCESS = 1; 

    private static final int SEARCH_RUNNING_APP = 2; 

 

    private ActivityManager mActivityManager = null; 

    // ProcessInfo Model类 用来保存所有进程信息 

    private List<ProcessInfo> processInfoList = null; 

 

    private ListView listviewProcess; 

    private TextView tvTotalProcessNo ;  

     

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

 

        setContentView(R.layout.browse_process_list); 

 

        listviewProcess = (ListView) findViewById(R.id.listviewProcess); 

        listviewProcess.setOnItemClickListener(this); 

         

        tvTotalProcessNo =(TextView)findViewById(R.id.tvTotalProcessNo); 

         

        this.registerForContextMenu(listviewProcess); 

        // 获得ActivityManager服务的对象 

        mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 

        // 获得系统进程信息 

        getRunningAppProcessInfo(); 

        // 为ListView构建适配器对象 

        BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter( 

                this, processInfoList); 

        listviewProcess.setAdapter(mprocessInfoAdapter); 

     

        tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size()); 

    } 

    //杀死该进程,并且刷新 

    @Override 

    public void onItemClick(AdapterView<?> arg0, View arg1,  final int position, long arg3) { 

        // TODO Auto-generated method stub 

        new AlertDialog.Builder(this).setMessage("是否杀死该进程") 

        .setPositiveButton("确定", new DialogInterface.OnClickListener() { 

             

            @Override 

            public void onClick(DialogInterface dialog, int which) { 

                // TODO Auto-generated method stub 

                //杀死该进程,释放进程占用的空间 

                mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName()); 

                           //刷新界面 

                getRunningAppProcessInfo() ; 

                BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter( 

                        BrowseProcessInfoActivity.this, processInfoList); 

                listviewProcess.setAdapter(mprocessInfoAdapter); 

                tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size()); 

 

            } 

        }).setNegativeButton("取消", new DialogInterface.OnClickListener() { 

             

            @Override 

            public void onClick(DialogInterface dialog, int which) { 

                // TODO Auto-generated method stub 

                dialog.cancel() ; 

            } 

        }).create().show() ; 

    } 

    // 获得系统进程信息 

    private void getRunningAppProcessInfo() { 

        // ProcessInfo Model类   用来保存所有进程信息 

        processInfoList = new ArrayList<ProcessInfo>(); 

 

        // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程 

        List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager 

                .getRunningAppProcesses(); 

 

        for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) { 

            // 进程ID号 

            int pid = appProcessInfo.pid; 

            // 用户ID 类似于Linux的权限不同,ID也就不同 比如root等 

            int uid = appProcessInfo.uid; 

            // 进程名,默认是包名或者由属性android:process=""指定 

            String processName = appProcessInfo.processName; 

            // 获得该进程占用的内存 

            int[] myMempid = new int[] { pid }; 

            // 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息 

            Debug.MemoryInfo[] memoryInfo = mActivityManager 

                    .getProcessMemoryInfo(myMempid); 

            // 获取进程占内存用信息kb单位 

            int memSize = memoryInfo[0].dalvikPrivateDirty; 

 

            Log.i(TAG, "processName: " + processName + "  pid: " + pid 

                    + " uid:" + uid + " memorySize is -->" + memSize + "kb"); 

            // 构造一个ProcessInfo对象 

            ProcessInfo processInfo = new ProcessInfo(); 

            processInfo.setPid(pid); 

            processInfo.setUid(uid); 

            processInfo.setMemSize(memSize); 

            processInfo.setPocessName(processName); 

            processInfoList.add(processInfo); 

 

            // 获得每个进程里运行的应用程序(包),即每个应用程序的包名 

            String[] packageList = appProcessInfo.pkgList; 

            Log.i(TAG, "process id is " + pid + "has " + packageList.length); 

            for (String pkg : packageList) { 

                Log.i(TAG, "packageName " + pkg + " in process id is -->"+ pid); 

            } 

        } 

    } 

 

    public void onCreateContextMenu(ContextMenu menu, View v, 

            ContextMenuInfo menuInfo) { 

        menu.add(0, 0, KILL_PORCESS, "杀死该进程"); 

        menu.add(0, 0, SEARCH_RUNNING_APP, "运行在该进程的应用程序"); 

        super.onCreateContextMenu(menu, v, menuInfo); 

 

    } 

 

    public boolean onContextItemSelected(MenuItem item) { 

        switch (item.getItemId()) { 

        case KILL_PORCESS: // 杀死该进程 , 重新加载界面 

            new AlertDialog.Builder(this).setMessage("是否杀死该进程") 

            .setPositiveButton("确定", new DialogInterface.OnClickListener() { 

                 

                @Override 

                public void onClick(DialogInterface dialog, int which) { 

                    // TODO Auto-generated method stub 

                     

                } 

            }).setNegativeButton("取消", new DialogInterface.OnClickListener() { 

                 

                @Override 

                public void onClick(DialogInterface dialog, int which) { 

                    // TODO Auto-generated method stub 

                    dialog.cancel() ; 

                } 

            }).create().show() ; 

            break; 

        case SEARCH_RUNNING_APP: // 查看运行在该进程的应用程序信息 

            break; 

        default: 

            break; 

        } 

        return super.onContextItemSelected(item); 

    } 

 

 

   我们可以通过进程占用内存大小来进而获取占用cpu大小,直接换算还是很简单的。

 

   源代码地址: http://up.2cto.com/2011/1117/20111117123207234.rar

 

  摘自 http://blog.csdn.net/qinjuning

这篇关于Android中获取系统内存信息以及进程信息-----ActivityManager的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071101

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者