在Android里,app和process和task是三个不同的概念.
process是一个继承自Linux的概念,一般一个app会有一个uid,一般会独立地开一个process。
但是,也会有多个app共享一个process或者uid的,这个可以自己指定。
task是一个activity的栈,其中"可能"含有来自多个App(不一定在同一process中)中的activity。
ActivityManager类可以获取运行信息,如下:
- getRecentTasks() 最近开的task,HOME键长按会看到这个
- getRunningAppProcesses() 运行中的作为app容器的process
- getRunningServices() 运行中的后台服务
- getRunningTasks() 运行中的任务
如果一个Activity “mainActivity”不是作为task的root activity打开的,而是被别的Task中Activity调用,那么mainActivity对应的process是开着的,这时我们是否要显示它呢?
另外,如果一个app只有service开着而在Task中不存在这个app的Activity,算不算开着呢?
所以要根据我们的项目需求进行不同的处理,现在贴出两个常用的方法:
1.获取正在运行的进程列表:
-
-
-
-
-
- public static List<Programe> getRunningProcess(Context context){
- PackagesInfo pi = PackagesInfo.getInstance(context);
-
- ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
- PackageManager pm =context.getPackageManager();
- List<Programe> list = new ArrayList<Programe>();
- Programe pr = new Programe();
- try {
- for(RunningAppProcessInfo ra : run){
- if(ra.processName.equals("system") || ra.processName.equals("com.Android.phone")){
- continue;
- }
- pr = new Programe();
- pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm));
- pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString());
- Log.v("tag","icon = " + pr.getIcon() +"name=" + pr.getName());
- list.add(pr);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return list;
- }
2. 获取最近运行的程序列表(近期任务),长按home键所示效果:
- public static String getTaskList(Context context) {
- ImageButton ivIcon;
- String apps = "";
- ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
- PackageManager pm = context.getPackageManager();
- try {
- List<RecentTaskInfo> list = am.getRecentTasks(64, 0);
- for (RecentTaskInfo ti : list) {
- Intent intent = ti.baseIntent;
- ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
- if (resolveInfo != null) {
- ivIcon = new ImageButton(context);
- ivIcon.setImageDrawable(resolveInfo.loadIcon(pm));
- ivIcon.setFocusable(true);
- ivIcon.setClickable(true);
- ivIcon.setEnabled(true);
- ivIcon.setScaleType(ScaleType.CENTER);
- ivIcon.setLayoutParams(new LinearLayout.LayoutParams(120, 120));
- apps = apps.equals("")?resolveInfo.loadLabel(pm)+"":apps+","+resolveInfo.loadLabel(pm);
- }
- }
- return apps;
- } catch (SecurityException se) {
- se.printStackTrace();
- return apps;
- }
- }
3.判断程序是否是栈顶程序
-
-
-
-
-
-
- public static boolean isTopActivy(String packageName, Context context)
- {
- ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
- ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
- String currentPackageName = cn.getPackageName();
-
- return (currentPackageName != null && currentPackageName.equals(packageName));
- }
参考:
http://blog.csdn.net/Yao_GUET/article/details/6267943