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

Android系统中,app、process和task各有特点:process基于Linux,通常每个app独立运行;task是activity堆栈,可能包含不同app的activity。通过ActivityManager的API如getRecentTasks()、getRunningAppProcesses()等可以获取运行信息。对于如何判断app是否运行,取决于项目需求。文中提供获取运行进程和近期任务列表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在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.youkuaiyun.com/Yao_GUET/article/details/6267943


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值