0
点赞
收藏
分享

微信扫一扫

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

何晓杰Dev 2023-03-28 阅读 53


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


先看看效果图:


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

下面是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:

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

6.0系统:

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

举报

相关推荐

0 条评论