您的位置:首页 > 其它

73获取正在运行的进程的信息

2014-12-23 15:01 399 查看
获取正在运行的进程信息:包括进程的名字,进程和进程之间的区别(包名),图标,占用内存的大小,用户进程还是系统进程:

显示实体类:

package com.ustc.mobilemanager.domain;

import android.graphics.drawable.Drawable;

/**
 * 进程信息的业务bean
 * 
 * @author
 * 
 */
public class TaskInfo {

	private Drawable icon;
	private String name;
	private String packname;
	private long memSize;// 内存占用大小
	private boolean userTask;// 用户进程(true)or系统进程(false)

	public Drawable getIcon() {
		return icon;
	}

	public void setIcon(Drawable icon) {
		this.icon = icon;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPackname() {
		return packname;
	}

	public void setPackname(String packname) {
		this.packname = packname;
	}

	public long getMemSize() {
		return memSize;
	}

	public void setMemSize(long memSize) {
		this.memSize = memSize;
	}

	public boolean isUserTask() {
		return userTask;
	}

	public void setUserTask(boolean userTask) {
		this.userTask = userTask;
	}

	@Override
	public String toString() {
		return "TaskInfo [icon=" + icon + ", name=" + name + ", packname="
				+ packname + ", memSize=" + memSize + ", userTask=" + userTask
				+ "]";
	}

}
业务类:

package com.ustc.mobilemanager.engine;

import java.util.ArrayList;
import java.util.List;

import com.ustc.mobilemanager.R;
import com.ustc.mobilemanager.domain.TaskInfo;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Debug.MemoryInfo;

/**
 * 
 * 提供手机里面的进程信息
 * 
 * @author
 * 
 */
public class TaskInfoProvider {

	/**
	 * 获取所有的进程信息
	 * 
	 * @param context
	 * @return
	 */
	public static List<TaskInfo> getTaskInfo(Context context) {

		ActivityManager am = (ActivityManager) context
				.getSystemService(Context.ACTIVITY_SERVICE);
		PackageManager pm = context.getPackageManager();
		List<RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();

		List<TaskInfo> taskInfos = new ArrayList<TaskInfo>();
		for (RunningAppProcessInfo processInfo : processInfos) {

			TaskInfo taskInfo = new TaskInfo();

			// 进程名就是包名
			String packname = processInfo.processName;

			taskInfo.setPackname(packname);

			// import android.os.Debug.MemoryInfo导包不能导错了
			MemoryInfo[] memoryInfos = am
					.getProcessMemoryInfo(new int[] { processInfo.pid });
			// 转成byte,方便转化
			long memsize = memoryInfos[0].getTotalPrivateDirty() * 1024l;
			taskInfo.setMemSize(memsize);

			try {
				// PackageInfo packageInfo = pm.getPackageInfo(packname, 0);
				// packageInfo.applicationInfo

				ApplicationInfo applicationInfo = pm.getApplicationInfo(
						packname, 0);
				Drawable icon = applicationInfo.loadIcon(pm);
				taskInfo.setIcon(icon);

				String name = applicationInfo.loadLabel(pm).toString();

				taskInfo.setName(name);

				if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
					// 用户进程
					taskInfo.setUserTask(true);

				} else {
					// 系统进程

					taskInfo.setUserTask(false);
				}

			} catch (Exception e) {
				e.printStackTrace();
				//系统内核进程   没有名称
				taskInfo.setName(packname);
				taskInfo.setIcon(context.getResources().getDrawable(R.drawable.icon));
			}
			taskInfos.add(taskInfo);
		}
		return taskInfos;
	}

}


方法也是通过ActivityManager的getRunningAppProcesses获得RunningAppProcessInfo的List集合,对这个集合做遍历:

RunningAppProcessInfo的processName就是包名;将进程的pid传入ActivityManager的getProcessMemoryInfo方法,得到MemoryInfo数组,通过getTotalPrivateDirty方法,得到进程占用手机内存的大小;

package com.ustc.mobilemanager.engine;

import java.util.ArrayList;
import java.util.List;

import com.ustc.mobilemanager.R;
import com.ustc.mobilemanager.domain.TaskInfo;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Debug.MemoryInfo;

/**
 * 
 * 提供手机里面的进程信息
 * 
 * @author
 * 
 */
public class TaskInfoProvider {

	/**
	 * 获取所有的进程信息
	 * 
	 * @param context
	 * @return
	 */
	public static List<TaskInfo> getTaskInfo(Context context) {

		ActivityManager am = (ActivityManager) context
				.getSystemService(Context.ACTIVITY_SERVICE);
		PackageManager pm = context.getPackageManager();
		List<RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();

		List<TaskInfo> taskInfos = new ArrayList<TaskInfo>();
		for (RunningAppProcessInfo processInfo : processInfos) {

			TaskInfo taskInfo = new TaskInfo();

			// 进程名就是包名
			String packname = processInfo.processName;

			taskInfo.setPackname(packname);

			// import android.os.Debug.MemoryInfo导包不能导错了
			MemoryInfo[] memoryInfos = am
					.getProcessMemoryInfo(new int[] { processInfo.pid });
			// 转成byte,方便转化
			long memsize = memoryInfos[0].getTotalPrivateDirty() * 1024l;
			taskInfo.setMemSize(memsize);

			try {
				// PackageInfo packageInfo = pm.getPackageInfo(packname, 0);
				// packageInfo.applicationInfo

				ApplicationInfo applicationInfo = pm.getApplicationInfo(
						packname, 0);
				Drawable icon = applicationInfo.loadIcon(pm);
				taskInfo.setIcon(icon);

				String name = applicationInfo.loadLabel(pm).toString();

				taskInfo.setName(name);

				if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
					// 用户进程
					taskInfo.setUserTask(true);

				} else {
					// 系统进程

					taskInfo.setUserTask(false);
				}

			} catch (Exception e) {
				e.printStackTrace();
				//系统内核进程   没有名称
				taskInfo.setName(packname);
				taskInfo.setIcon(context.getResources().getDrawable(R.drawable.icon));
			}
			taskInfos.add(taskInfo);
		}
		return taskInfos;
	}

}


进程名和图标在applicationInfo这个节点下,判断是否是用户程序,只需要和ApplicationInfo.FLAG_SYSTEM做与运算就可以了,测试代码如下:

package com.ustc.mobilemanager.test;

import java.util.List;

import com.ustc.mobilemanager.domain.TaskInfo;
import com.ustc.mobilemanager.engine.TaskInfoProvider;

import android.test.AndroidTestCase;

public class TestTaskInfoProvider extends AndroidTestCase {

	public void testGetTaskInfo() throws Exception {

		List<TaskInfo> infos = TaskInfoProvider.getTaskInfo(getContext());

		for (TaskInfo taskInfo : infos) {
			System.out.println(taskInfo.toString());
		}

	}

}


打印:



不过,也引发了一些错误:(提示NameNotFoundException)



这个System的error未解决。要是知道怎么解决的朋友指导下。(我想应该不是代码的问题)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: