在Android 5.0系统以上,调用getRunningAppProcesses() 方法来获取所有运行的进程是获取不到的,因为谷歌出于安全的考虑,所以在5.0系统以上把这个方法移除了。那么我们又该如何去获取呢?不要急,大家先看看下面一个demo的源码。不过值得注意的是,下面这种方式只适合用于5.0系统以上,以下同样也是获取不到的。以下的直接调用getRunningAppProcesses() 方法即可。
先看看效果图:
下面是MainActivity类的代码,注意里面方法里的这句 List<AndroidAppProcess> listInfo = ProcessManager.getRunningAppProcesses() ,通过它来获取。需要导入一个jar包,该包在文章末尾可以下载得到。
[java] view plain copy 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; } }
下面是适配器的代码
[java] view plain copy 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; } }
下面是一个应用的实体类
[java] view plain copy 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; } }
下面是一个应用的工具类
[java] view plain copy 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
下面我补充一下6.0系统和华为P8的运行截图,是可以获取到的哦!
华为P8:
6.0系统: