在Android里,app和process和task是三个不同的概念.

process是一个继承自Linux的概念,一般一个app会有一个uid,一般会独立地开一个process。

但是,也会有多个app共享一个process或者uid的,这个可以自己指定。

task是一个activity的栈,其中"可能"含有来自多个App(不一定在同一process中)中的activity。

ActivityManager类可以获取运行信息,如下:

  1. getRecentTasks() 最近开的task,HOME键长按会看到这个
  2. getRunningAppProcesses() 运行中的作为app容器的process
  3. getRunningServices() 运行中的后台服务
  4. getRunningTasks() 运行中的任务

如果一个Activity “mainActivity”不是作为task的root activity打开的,而是被别的Task中Activity调用,那么mainActivity对应的process是开着的,这时我们是否要显示它呢?

另外,如果一个app只有service开着而在Task中不存在这个app的Activity,算不算开着呢?

所以要根据我们的项目需求进行不同的处理,现在贴出两个常用的方法:

1.获取正在运行的进程列表:

/** * 获取正在运行的程序信息  * @param context * @return */    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.判断程序是否是栈顶程序

/** * 判断当前程序是否在栈顶 * @param packageName * @param context * @return */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


更多相关文章

  1. Android(安卓)应用程序分析之Calculator ----核心计算部分的理解
  2. Android下实现Google街景
  3. 7年IT程序员的工资变化和成长历程
  4. Android官方API Guide学习之一 Android介绍-基础知识
  5. 云平台编程与开发(三):创建基于X5Cloud云平台的Hello World程序(运行
  6. Android(安卓)Touch事件获取手指触摸位置
  7. Android添加可拖动、点击的悬浮窗口
  8. Android(安卓)蓝牙串口调试程序开发
  9. Android(安卓)API Guiede---Animation and Graphics

随机推荐

  1. Android的组成,AS连接mumu模拟器
  2. androidUI布局仿猫扑界面
  3. Android API 中文 (50) ―― SpinnerAdapte
  4. android体系笔记
  5. 后台动态添加布局文件、控件与动态设置属
  6. 笔记:Android消息机制
  7. 13-4-22 Android的back按键的两常用功能
  8. Android studio用WiFi连接adb
  9. android 入门学习笔记 利用bundle实现and
  10. Android画图之Bitmap