在Android 5.0系统以上,调用getRunningAppProcesses() 方法来获取所有运行的进程是获取不到的,因为谷歌出于安全的考虑,所以在5.0系统以上把这个方法移除了。那么我们又该如何去获取呢?不要急,大家先看看下面一个demo的源码。不过值得注意的是,下面这种方式只适合用于5.0系统以上,以下同样也是获取不到的。以下的直接调用getRunningAppProcesses() 方法即可。
先看看效果图:
下面是MainActivity类的代码,注意里面方法里的这句 List<AndroidAppProcess> listInfo = ProcessManager.getRunningAppProcesses() ,通过它来获取。需要导入一个jar包,该包在文章末尾可以下载得到。
1. package com.qiulong.appprocesstest.activity;
2.
3. import java.util.ArrayList;
4. import java.util.List;
5.
6. import android.app.Activity;
7. import android.app.ActivityManager;
8. import android.content.Context;
9. import android.content.pm.ApplicationInfo;
10. import android.content.pm.PackageManager;
11. import android.os.Bundle;
12. import android.os.Debug;
13. import android.widget.ListView;
14. import android.widget.TextView;
15.
16. import com.jaredrummler.android.processes.ProcessManager;
17. import com.jaredrummler.android.processes.models.AndroidAppProcess;
18. import com.qiulong.appprocesslibrary.R;
19. import com.qiulong.appprocesstest.AppUtils;
20. import com.qiulong.appprocesstest.adapter.AppAdapter;
21. import com.qiulong.appprocesstest.entity.AppEntity;
22.
23. public class MainActivity extends Activity {
24.
25. private TextView versionText;
26. private ListView listView;
27. private AppAdapter adapter;
28.
29. @Override
30. protected void onCreate(Bundle savedInstanceState) {
31. super.onCreate(savedInstanceState);
32. setContentView(R.layout.activity_main);
33.
34. versionText = (TextView) findViewById(R.id.main_text);
35. "当前系统版本:" + android.os.Build.VERSION.RELEASE);
36.
37. listView = (ListView)findViewById(R.id.main_listview);
38. new AppAdapter(this, getAndroidProcess(this));
39. listView.setAdapter(adapter);
40.
41. }
42.
43. /**
44. * 5.0系统以上获取运行的进程方法
45. * @param context
46. * @param version
47. * @return
48. */
49. private List<AppEntity> getAndroidProcess(Context context) {
50. new ArrayList<AppEntity>();
51. ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
52. PackageManager pm = context.getPackageManager();
53. new AppUtils(context);
54. List<AndroidAppProcess> listInfo = ProcessManager.getRunningAppProcesses();
55. if(listInfo.isEmpty() || listInfo.size() == 0){
56. return null;
57. }
58. for (AndroidAppProcess info : listInfo) {
59. ApplicationInfo app = proutils.getApplicationInfo(info.name);
60. // 过滤自己当前的应用
61. if (app == null || context.getPackageName().equals(app.packageName)) {
62. continue;
63. }
64. // 过滤系统的应用
65. if ((app.flags & app.FLAG_SYSTEM) > 0) {
66. continue;
67. }
68. new AppEntity();
69. //应用的图标
70. //应用的名称
71. //应用的包名
72. // 计算应用所占内存大小
73. int[] myMempid = new int[] { info.pid };
74. Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(myMempid);
75. double memSize = memoryInfo[0].dalvikPrivateDirty / 1024.0;
76. int temp = (int) (memSize * 100);
77. 100.0;
78. //应用所占内存的大小
79.
80. resule.add(ent);
81. }
82. return resule;
83. }
84.
85. }
下面是适配器的代码
1. package com.qiulong.appprocesstest.adapter;
2.
3. import java.util.List;
4. import com.qiulong.appprocesslibrary.R;
5. import com.qiulong.appprocesstest.entity.AppEntity;
6. import android.content.Context;
7. import android.view.LayoutInflater;
8. import android.view.View;
9. import android.view.ViewGroup;
10. import android.widget.BaseAdapter;
11. import android.widget.ImageView;
12. import android.widget.TextView;
13.
14. public class AppAdapter extends BaseAdapter {
15.
16. private Context context;
17. private List<AppEntity> list;
18. private LayoutInflater inflater;
19.
20. public AppAdapter(Context context, List<AppEntity> list) {
21. this.context = context;
22. this.inflater = LayoutInflater.from(context);
23. this.list = list;
24. }
25.
26. @Override
27. public int getCount() {
28. if (list == null) {
29. return 0;
30. }
31. return list.size();
32. }
33.
34. @Override
35. public Object getItem(int position) {
36. if (list == null) {
37. return null;
38. }
39. return list.get(position);
40. }
41.
42. @Override
43. public long getItemId(int position) {
44. if (list == null) {
45. return 0;
46. }
47. return position;
48. }
49.
50. @Override
51. public View getView(int position, View view, ViewGroup parent) {
52. ViewHolder holder;
53. if (view == null) {
54. new ViewHolder();
55. null);
56. holder.icon = (ImageView) view.findViewById(R.id.item_icon);
57. holder.name = (TextView) view.findViewById(R.id.item_name);
58. holder.size = (TextView) view.findViewById(R.id.item_size);
59. view.setTag(holder);
60. else {
61. holder = (ViewHolder) view.getTag();
62. }
63. final AppEntity ent = list.get(position);
64. holder.icon.setImageDrawable(ent.getAppIcon());
65. holder.name.setText(ent.getAppName());
66. "MB");
67. return view;
68. }
69.
70. static class ViewHolder {
71. private ImageView icon;
72. private TextView name;
73. private TextView size;
74. }
75. }
下面是一个应用的实体类
1. package com.qiulong.appprocesstest.entity;
2.
3. import android.graphics.drawable.Drawable;
4.
5. public class AppEntity {
6. private Drawable appIcon;
7. private String appName;
8. private String packageName;
9. private double memorySize;
10.
11. public Drawable getAppIcon() {
12. return appIcon;
13. }
14.
15. public void setAppIcon(Drawable appIcon) {
16. this.appIcon = appIcon;
17. }
18.
19. public String getAppName() {
20. return appName;
21. }
22.
23. public void setAppName(String appName) {
24. this.appName = appName;
25. }
26.
27. public String getPackageName() {
28. return packageName;
29. }
30.
31. public void setPackageName(String packageName) {
32. this.packageName = packageName;
33. }
34.
35. public double getMemorySize() {
36. return memorySize;
37. }
38.
39. public void setMemorySize(double memorySize) {
40. this.memorySize = memorySize;
41. }
42.
43. }
下面是一个应用的工具类
1. package com.qiulong.appprocesstest;
2.
3. import java.util.List;
4. import android.content.Context;
5. import android.content.pm.ApplicationInfo;
6. import android.content.pm.PackageManager;
7.
8. /**
9. * 应用程序工具类
10. *
11. * @author qiulong
12. *
13. */
14. public class AppUtils {
15.
16. private List<ApplicationInfo> appList;
17.
18. public AppUtils(Context context) {
19. // 通过包管理器,检索所有的应用程序
20. PackageManager pm = context.getPackageManager();
21. appList = pm
22. .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
23. }
24.
25. /**
26. * 通过包名返回一个应用的Application对象
27. *
28. * @param name
29. * @return ApplicationInfo
30. */
31. public ApplicationInfo getApplicationInfo(String pkgName) {
32. if (pkgName == null) {
33. return null;
34. }
35. for (ApplicationInfo appinfo : appList) {
36. if (pkgName.equals(appinfo.processName)) {
37. return appinfo;
38. }
39. }
40. return null;
41. }
42.
43. }
好了,有需要的朋友可以点击下面的链接,下载完整的demo以及需要的jar包。
下面我补充一下6.0系统和华为P8的运行截图,是可以获取到的哦!
华为P8:
6.0系统: