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

来源:互联网 发布:万网ftp端口 编辑:程序博客网 时间:2024/06/09 23:53

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


先看看效果图:



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

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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.         versionText.setText("当前系统版本:" + android.os.Build.VERSION.RELEASE);  
  36.           
  37.         listView = (ListView)findViewById(R.id.main_listview);  
  38.         adapter = 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.         List<AppEntity> resule = new ArrayList<AppEntity>();  
  51.         ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  
  52.         PackageManager pm = context.getPackageManager();  
  53.         AppUtils proutils = 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.             AppEntity ent = new AppEntity();  
  69.             ent.setAppIcon(app.loadIcon(pm));//应用的图标  
  70.             ent.setAppName(app.loadLabel(pm).toString());//应用的名称  
  71.             ent.setPackageName(app.packageName);//应用的包名  
  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.             memSize = temp / 100.0;  
  78.             ent.setMemorySize(memSize);//应用所占内存的大小  
  79.               
  80.             resule.add(ent);  
  81.         }  
  82.         return resule;  
  83.     }  
  84.   
  85. }  


下面是适配器的代码

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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.             holder = new ViewHolder();  
  55.             view = inflater.inflate(R.layout.activity_listview_item, 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.         holder.size.setText(ent.getMemorySize() + "MB");  
  67.         return view;  
  68.     }  
  69.   
  70.     static class ViewHolder {  
  71.         private ImageView icon;  
  72.         private TextView name;  
  73.         private TextView size;  
  74.     }  
  75. }  


下面是一个应用的实体类

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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. }  


下面是一个应用的工具类

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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包。

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


下面我补充一下6.0系统和华为P8的运行截图,是可以获取到的哦!

华为P8:


6.0系统:


0 0
原创粉丝点击