您的位置:首页 > 移动开发

Android:分析app、Process、Task之间的区别,以及获取最近运行的程序(近期任务)与正在运行的程序

2017-06-16 17:02 671 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。


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

[java] view
plain copy

/** 

 * 获取正在运行的程序信息  

 * @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键所示效果:

[java] view
plain copy

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.判断程序是否是栈顶程序

[java] view
plain copy

/** 

 * 判断当前程序是否在栈顶 

 * @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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐