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

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


先看看效果图:

Android 5.0系统以上获取所有运行进程_第1张图片


下面是MainActivity类的代码,注意里面方法里的这句 List<AndroidAppProcess> listInfo = ProcessManager.getRunningAppProcesses() ,通过它来获取。需要导入一个jar包,该包在文章末尾可以下载得到。

package com.qiulong.appprocesstest.activity;

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

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Debug;
import android.widget.ListView;
import android.widget.TextView;

import com.jaredrummler.android.processes.ProcessManager;
import com.jaredrummler.android.processes.models.AndroidAppProcess;
import com.qiulong.appprocesslibrary.R;
import com.qiulong.appprocesstest.AppUtils;
import com.qiulong.appprocesstest.adapter.AppAdapter;
import com.qiulong.appprocesstest.entity.AppEntity;

public class MainActivity extends Activity {

	private TextView versionText;
	private ListView listView;
	private AppAdapter adapter;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		versionText = (TextView) findViewById(R.id.main_text);
		versionText.setText("当前系统版本:" + android.os.Build.VERSION.RELEASE);
		
		listView = (ListView)findViewById(R.id.main_listview);
		adapter = new AppAdapter(this, getAndroidProcess(this));
		listView.setAdapter(adapter);

	}

	/**
	 * 5.0系统以上获取运行的进程方法
	 * @param context
	 * @param version
	 * @return
	 */
	private List<AppEntity> getAndroidProcess(Context context) {
		List<AppEntity> resule = new ArrayList<AppEntity>();
		ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		PackageManager pm = context.getPackageManager();
		AppUtils proutils = new AppUtils(context);
		List<AndroidAppProcess> listInfo = ProcessManager.getRunningAppProcesses();
		if(listInfo.isEmpty() || listInfo.size() == 0){
			return null;
		}
		for (AndroidAppProcess info : listInfo) {
			ApplicationInfo app = proutils.getApplicationInfo(info.name);
			// 过滤自己当前的应用
			if (app == null || context.getPackageName().equals(app.packageName)) {
				continue;
			}
			// 过滤系统的应用
			if ((app.flags & app.FLAG_SYSTEM) > 0) {
				continue;
			}
			AppEntity ent = new AppEntity();
			ent.setAppIcon(app.loadIcon(pm));//应用的图标
			ent.setAppName(app.loadLabel(pm).toString());//应用的名称
			ent.setPackageName(app.packageName);//应用的包名
			// 计算应用所占内存大小
			int[] myMempid = new int[] { info.pid };
			Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(myMempid);
			double memSize = memoryInfo[0].dalvikPrivateDirty / 1024.0;
			int temp = (int) (memSize * 100);
			memSize = temp / 100.0;
			ent.setMemorySize(memSize);//应用所占内存的大小
			
			resule.add(ent);
		}
		return resule;
	}

}


下面是适配器的代码

package com.qiulong.appprocesstest.adapter;

import java.util.List;
import com.qiulong.appprocesslibrary.R;
import com.qiulong.appprocesstest.entity.AppEntity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class AppAdapter extends BaseAdapter {

	private Context context;
	private List<AppEntity> list;
	private LayoutInflater inflater;

	public AppAdapter(Context context, List<AppEntity> list) {
		this.context = context;
		this.inflater = LayoutInflater.from(context);
		this.list = list;
	}

	@Override
	public int getCount() {
		if (list == null) {
			return 0;
		}
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		if (list == null) {
			return null;
		}
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		if (list == null) {
			return 0;
		}
		return position;
	}

	@Override
	public View getView(int position, View view, ViewGroup parent) {
		ViewHolder holder;
		if (view == null) {
			holder = new ViewHolder();
			view = inflater.inflate(R.layout.activity_listview_item, null);
			holder.icon = (ImageView) view.findViewById(R.id.item_icon);
			holder.name = (TextView) view.findViewById(R.id.item_name);
			holder.size = (TextView) view.findViewById(R.id.item_size);
			view.setTag(holder);
		} else {
			holder = (ViewHolder) view.getTag();
		}
		final AppEntity ent = list.get(position);
		holder.icon.setImageDrawable(ent.getAppIcon());
		holder.name.setText(ent.getAppName());
		holder.size.setText(ent.getMemorySize() + "MB");
		return view;
	}

	static class ViewHolder {
		private ImageView icon;
		private TextView name;
		private TextView size;
	}
}


下面是一个应用的实体类

package com.qiulong.appprocesstest.entity;

import android.graphics.drawable.Drawable;

public class AppEntity {
	private Drawable appIcon;
	private String appName;
	private String packageName;
	private double memorySize;

	public Drawable getAppIcon() {
		return appIcon;
	}

	public void setAppIcon(Drawable appIcon) {
		this.appIcon = appIcon;
	}

	public String getAppName() {
		return appName;
	}

	public void setAppName(String appName) {
		this.appName = appName;
	}

	public String getPackageName() {
		return packageName;
	}

	public void setPackageName(String packageName) {
		this.packageName = packageName;
	}

	public double getMemorySize() {
		return memorySize;
	}

	public void setMemorySize(double memorySize) {
		this.memorySize = memorySize;
	}

}


下面是一个应用的工具类

package com.qiulong.appprocesstest;

import java.util.List;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;

/**
 * 应用程序工具类
 * 
 * @author qiulong
 * 
 */
public class AppUtils {

	private List<ApplicationInfo> appList;

	public AppUtils(Context context) {
		// 通过包管理器,检索所有的应用程序
		PackageManager pm = context.getPackageManager();
		appList = pm
				.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
	}

	/**
	 * 通过包名返回一个应用的Application对象
	 * 
	 * @param name
	 * @return ApplicationInfo
	 */
	public ApplicationInfo getApplicationInfo(String pkgName) {
		if (pkgName == null) {
			return null;
		}
		for (ApplicationInfo appinfo : appList) {
			if (pkgName.equals(appinfo.processName)) {
				return appinfo;
			}
		}
		return null;
	}

}

好了,有需要的朋友可以点击下面的链接,下载完整的demo以及需要的jar包。

此处下载完整demo以及jar包:http://download.csdn.net/detail/baidu_23478311/9394372


你可能感兴趣的:(android,5.0系统以上,后台运行的程序,获取运行的进程,获取运行的程序,5.0以上)