分享

Android:分析app、Process、Task之间的区别,以及获取最近运行的程序(近...

 lifei_szdz 2013-09-21

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.获取正在运行的进程列表:

  1. /** 
  2.  * 获取正在运行的程序信息  
  3.  * @param context 
  4.  * @return 
  5.  */  
  6.    public static List<Programe> getRunningProcess(Context context){   
  7.        PackagesInfo pi = PackagesInfo.getInstance(context);   
  8.           
  9.        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);   
  10.        List<RunningAppProcessInfo> run = am.getRunningAppProcesses();    
  11.        PackageManager pm =context.getPackageManager();   
  12.        List<Programe> list = new ArrayList<Programe>();       
  13.        Programe  pr = new Programe();    
  14.        try {  
  15.         for(RunningAppProcessInfo ra : run){   
  16.             if(ra.processName.equals("system") || ra.processName.equals("com.Android.phone")){ //可以根据需要屏蔽掉一些进程  
  17.                 continue;   
  18.             }   
  19.             pr = new Programe();   
  20.             pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm));   
  21.             pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString());  
  22.             Log.v("tag","icon = " + pr.getIcon() +"name=" + pr.getName());  
  23.             list.add(pr);   
  24.         }     
  25.     } catch (Exception e) {  
  26.         e.printStackTrace();  
  27.     }  
  28.        return list;   
  29.    }  

2. 获取最近运行的程序列表(近期任务),长按home键所示效果:


  1. public static String getTaskList(Context context) {    
  2.         ImageButton ivIcon;  
  3.         String apps = "";  
  4.         ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);    
  5.         PackageManager pm = context.getPackageManager();    
  6.         try {    
  7.             List<RecentTaskInfo> list = am.getRecentTasks(640);    
  8.             for (RecentTaskInfo ti : list) {    
  9.                 Intent intent = ti.baseIntent;    
  10.                 ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);    
  11.                 if (resolveInfo != null) {    
  12.                     ivIcon = new ImageButton(context);    
  13.                     ivIcon.setImageDrawable(resolveInfo.loadIcon(pm));    
  14.                     ivIcon.setFocusable(true);    
  15.                     ivIcon.setClickable(true);    
  16.                     ivIcon.setEnabled(true);    
  17.                     ivIcon.setScaleType(ScaleType.CENTER);    
  18.                     ivIcon.setLayoutParams(new LinearLayout.LayoutParams(120120));   
  19.                     apps = apps.equals("")?resolveInfo.loadLabel(pm)+"":apps+","+resolveInfo.loadLabel(pm);   
  20.                 }    
  21.             }  
  22.             return apps;  
  23.         } catch (SecurityException se) {    
  24.             se.printStackTrace();  
  25.             return apps;  
  26.         }    
  27.     }   

3.判断程序是否是栈顶程序

  1. /** 
  2.  * 判断当前程序是否在栈顶 
  3.  * @param packageName 
  4.  * @param context 
  5.  * @return 
  6.  */  
  7. public static boolean isTopActivy(String packageName, Context context)  
  8.    {  
  9.     ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);  
  10.     ComponentName cn = am.getRunningTasks(1).get(0).topActivity;  
  11.     String currentPackageName = cn.getPackageName();  
  12.   
  13.     return (currentPackageName != null && currentPackageName.equals(packageName));  
  14.    }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多