Android 5.0系统以上获取所有运行进程
在Android 5.0系统以上,调用getRunningAppProcesses() 方法来获取所有运行的进程是获取不到的,因为谷歌出于安全的考虑,所以在5.0系统以上把这个方法移除了。那么我们又该如何去获取呢?不要急,大家先看看下面一个demo的源码。不过值得注意的是,下面这种方式只适合用于5.0系统以上,以下同样也是获取不到的。以下的直接调用getRunningAppProcesses() 方法即可。
先看看效果图:
下面是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.****.net/detail/baidu_23478311/9394372
下面我补充一下6.0系统和华为P8的运行截图,是可以获取到的哦!
华为P8:
6.0系统: