Android 前后台判断

最近的项目有一个功能需求,要求程序退到后台的时候,在顶部通知栏处显示一个通知,用以下代码:


	/**
	 * 程序前后台判断
	 * @return
	 */
	private boolean isAppOnForeground() {   
		ActivityManager activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);  
		String packageName = this.getPackageName();
        List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();   
        if (appProcesses == null) 
        	return false;   
        for (RunningAppProcessInfo appProcess : appProcesses) {   
            if (appProcess.processName.equals(packageName)   
                    && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {   
                return true;   
            }   
        }   
        return false;   
    }   


经过测试,在一般情况下可行,在某些经过简洁版本的Android系统中 RunningAppProcessInfo.importance的值一直为400,原因未找到,RunningAppProcessInfo 里面的变量importance其实是表示这个app进程的重要性,因为系统回收时候,会根据importance的重要来杀进程的。具体可以去看文档。
IMPORTANCE_BACKGROUND = 400
public static final int IMPORTANCE_EMPTY = 500
public static final int IMPORTANCE_FOREGROUND = 100
public static final int IMPORTANCE_SERVICE = 300
public static final int IMPORTANCE_VISIBLE = 200


另外一种方法则可行:

    /**
     * 判断当前应用程序是否处于后台,通过getRunningTasks的方式
     * @return true 在后台; false 在前台
     */
    public  boolean isApplicationBroughtToBackgroundByTask() {
        List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(getPackageName())) {
                return true;
            }
        }
        return false;
    }


由于第一种方法在大部分情况下可行,所以继续沿用,并用第二种方法做保证。

全部代码,仅供参考:

public class BaseActivity extends Activity {
	public static boolean notifyShowing = false;
	public static boolean isSpecialSystem=false;
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        MyRestoreInstanceState(bundle);
        sAllActivity.add(this);   
		activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);  
		keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
    }     

    protected void onStart() {
		super.onStart();
		if(notifyShowing){
			stopService(new Intent(this, LocalService.class));
			notifyShowing = false;
		}
	}
	
	protected void onStop() {
		super.onStop();
		if(!isAppOnForeground()){
			notifyShowing = true;
			startService(new Intent(this, LocalService.class));
		}
	}
    
	ActivityManager activityManager;
	KeyguardManager keyguardManager;
	/**
	 * 判断程序是否在前台
	 * @return true 在前台; false 在后台
	 */
	private boolean isAppOnForeground() {   
		if(!isSpecialSystem){
			boolean isspecial=true;
			String packageName = this.getPackageName();
	        List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();   
	        if (appProcesses == null) 
	        	return false;   
	        for (RunningAppProcessInfo appProcess : appProcesses) {   
	            if (appProcess.processName.equals(packageName)) {
	            	if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND||appProcess.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) {   
	            		return true;   
	            	}
	            	if (keyguardManager.inKeyguardRestrictedInputMode()) return true;
	            }  
	            if(isspecial){
	            	if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
	            		isspecial=false;
		            }
	            }
	        }
	        if(isspecial){
	        	isSpecialSystem=true;
	        	return !isApplicationBroughtToBackgroundByTask();
	        }
	        return false;   
		}else{
			return !isApplicationBroughtToBackgroundByTask();
		}
    }   
	
    /**
     * 判断当前应用程序是否处于后台,通过getRunningTasks的方式
     * @return true 在后台; false 在前台
     */
    public  boolean isApplicationBroughtToBackgroundByTask() {
        List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(getPackageName())) {
                return true;
            }
        }
        return false;
    }
	
}



 




 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值