(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.RecentTaskInfoActivityManager.RunningServiceInfoActivityManager.RunningTaskInfo

   类的介绍留在后文介绍。

Demo说明:

核心代码;

package com.rf.activitymanagerdemo;

import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import android.os.Bundle;
import android.os.Debug;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.pm.ConfigurationInfo;
import android.widget.Toast;

public class MainActivity extends Activity {
	// ProcessInfo Model类 用来保存所有进程信息
	private List<ProcessInfo> processInfoList = new ArrayList<ProcessInfo>();
	// ServiceInfo Model类用来保存所有服务信息
	private List<ServiceInfo> serviceInfoList=new ArrayList<ServiceInfo>();

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 获取ActivityManager;
		ActivityManager manager = (ActivityManager) this
				.getSystemService(ACTIVITY_SERVICE);
		// 设备配置属性----ConfigurationInfo
		ConfigurationInfo configuration = manager.getDeviceConfigurationInfo();
		// 开发者--sdk版本
		String version = configuration.getGlEsVersion();
		// 开发者---设备相关信息
		String content = configuration.toString();
		// 开发者---描述内容统计
		int count = configuration.describeContents();
		Toast.makeText(
				MainActivity.this,
				"版本信息:" + version + "\t\n" + "内容:" + content + "\t\n描述内容统计:"
						+ count, Toast.LENGTH_LONG).show();
		System.out.println("版本信息:" + version + "\t\n" + "内容:" + content
				+ "+\t\n描述内容统计:" + count);

		// 内存管理对象----MemoryInfo
		// 获得MemoryInfo对象
		MemoryInfo memoryInfo = new MemoryInfo();
		// 获得系统可用内存,保存在MemoryInfo对象上
		manager.getMemoryInfo(memoryInfo);
		// 可用内存
		long memSize = memoryInfo.availMem;
		System.out.println("可用内存数:" + formateFileSize(memSize));

		// 进程管理对象-----.RunningAppProcessInfo
		getRunningAppProcessInfo(manager);
		//服务管理对象--------RunningServiceInfo
		getRunningServerInfo(manager);

	}

	// 调用系统函数,字符串转换long -String KB/MB
	private String formateFileSize(long size) {
		return Long.toString(size);

	}

	// 获得系统进程信息
	private void getRunningAppProcessInfo(ActivityManager manager) {
		// 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
		List<ActivityManager.RunningAppProcessInfo> appProcessList = manager
				.getRunningAppProcesses();
		// 迭代appProcessList
		for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
			// 进程实例化对象
			ProcessInfo info = new ProcessInfo();
			// 进程父Id
			info.setPid(appProcessInfo.pid);
			// 进行Id
			info.setUid(appProcessInfo.uid);
			// 进程名称
			info.setProcessname(appProcessInfo.processName);
			// 获得该进程占用的内存
			// 获得该进程占用的内存
			int[] myMempid = new int[] { appProcessInfo.pid };

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

			Debug.MemoryInfo[] memoryInfo = manager

			.getProcessMemoryInfo(myMempid);

			// 获取进程占内存用信息kb单位
			int memSize = memoryInfo[0].dalvikPrivateDirty;

			// 进程占用资源
			info.setMemsize(memSize);

			// 添加队列
			processInfoList.add(info);

		}
		for (int i = 0; i < appProcessList.size(); i++) {
			System.out.println("相关" + processInfoList.get(i) + "进程信息:\t\r"
					+ "进程名称:" + processInfoList.get(i).getProcessname()
					+ "\t\r,进程Id" + processInfoList.get(i).getPid()
					+ "\t\r,进程占用内存:" + processInfoList.get(i).getMemsize());
		}

	}
	
	//正在后台运行的服务
	public void getRunningServerInfo(ActivityManager manager){
		// 通过调用ActivityManager的getRunningServices()方法获得系统里所有正在运行的服务
		List<ActivityManager.RunningServiceInfo> runningserviceInfo=manager.getRunningServices(5);
		//迭代处理
		for(ActivityManager.RunningServiceInfo info:runningserviceInfo){
			ServiceInfo serviceinfo=new ServiceInfo();
			//服务Id
			serviceinfo.setUid(info.uid);
			//服务父Id
			serviceinfo.setPid(info.pid);
			//服务是否启动
			serviceinfo.setStarted(info.started);
			//服务名称
			serviceinfo.setProcessname(info.process);
			//服务管理统计
			serviceinfo.setClientcount(info.clientCount);
			//服务是否运行
			serviceinfo.setFlag(info.flags);
			
			serviceInfoList.add(serviceinfo);
			
		}
		for(int i=0;i<serviceInfoList.size();i++){
			System.out.println("相关信息:连接统计\r\t"+serviceInfoList.get(i).getClientcount()+"\r\t,Id编号:"+serviceInfoList.get(i).getUid()+"\r\t,父Id:"+serviceInfoList.get(i).getPid()+"\r\t,服务名称:"+serviceInfoList.get(i).getProcessname()+"\r\t,服务是否运行:"+serviceInfoList.get(i).getFlag()+"\r\t,服务是否启动:"+serviceInfoList.get(i).isStarted());
			
		}
		
	}

}

Model类:进程和服务

package com.rf.activitymanagerdemo;

import java.io.Serializable;

public class ProcessInfo implements Serializable {

	/**
	 * 进程实例化对象
	 */
	private static final long serialVersionUID = 1L;
	//设置进程Id
	private int uid;
	//设置进程父Id
	private int pid;
	//设置进程可用内存大小
	private int memsize;
	//设置进程名称
	private String processname;
	
	
	//相关的构造函数和set和get 方法
	public ProcessInfo() {
		super();
	}


	
	public int getUid() {
		return uid;
	}



	public void setUid(int uid) {
		this.uid = uid;
	}



	public int getPid() {
		return pid;
	}



	public void setPid(int pid) {
		this.pid = pid;
	}



	public int getMemsize() {
		return memsize;
	}



	public void setMemsize(int memsize) {
		this.memsize = memsize;
	}



	public String getProcessname() {
		return processname;
	}


	public void setProcessname(String processname) {
		this.processname = processname;
	}
	
	

}


 

package com.rf.activitymanagerdemo;

import java.io.Serializable;

public class ServiceInfo implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int uid;
	private int pid;
	//服务是否启动
	private boolean started;
	//服务名称
	private String processname;
	//服务是否运行标识
	private int flag;
	//服务管理统计
	private int clientcount;
	//相关的构造函数和set和get方法
	public ServiceInfo() {
		super();
	}
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public int getPid() {
		return pid;
	}
	public void setPid(int pid) {
		this.pid = pid;
	}
	public boolean isStarted() {
		return started;
	}
	public void setStarted(boolean started) {
		this.started = started;
	}
	public String getProcessname() {
		return processname;
	}
	public void setProcessname(String processname) {
		this.processname = processname;
	}
	public int getFlag() {
		return flag;
	}
	public void setFlag(int flag) {
		this.flag = flag;
	}
	public int getClientcount() {
		return clientcount;
	}
	public void setClientcount(int clientcount) {
		this.clientcount = clientcount;
	}
	
	
	

}



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值