一般情况下判断app是否在后台运行主要通过系统服务Context.ACTIVITY_SERVICE获取activityManager,然后再通过遍历当前应用的进程信息来判断是否在后台运行,比如如下方法:
public static boolean isBackground(Context context) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
if (appProcess.importance != RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true; //处于后台
} else {
return false; //处于前台
}
}
}
return false;
}
这种方法也是比较通用的方法,但是有一个缺点,就是效率可能会差一些,因为要遍历进程信息。
如果想要用优雅一些的方式来处理的话也是可以的,我们可以利用Google提供的另外一个api来实现。Android sdk 14版本开始,官方提供了一个回调:ActivityLifecycleCallbacks,利用这个回调可以检测到应用内所有activity的生命周期,因为这个回调本身定义了activity的所有生命周期方法!
public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}
那么如何使用这个回调实现上文讲到的前后台切换的监听处理呢?
需要说明的是,ActivityLifecycleCallbacks回调的注册和监听都需要在自定义的application中进行,所以需要预先自定义一个application。
首先定义一个计数器count=0;至于为甚么要使用计数器,后续会有说明
oncreate方法中调用registerActivityLifecycleCallbacks()方法注册回调,代码如下:
this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
// Toast.makeText(activity,"应用程序进入后台",Toast.LENGTH_LONG).show();
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
然后重写onActivityStarted和onActivityStopped,在onActivityStarted中让计数器+1;在onActivityStopped中让计数器-1;
onActivityStopped中判断计数器是否=0,如果计数器==0,说明程序运行在后台。代码如下
@Override
public void onActivityStarted(Activity activity) {
count+=1;
}
@Override
public void onActivityStopped(Activity activity) {
count-=1;
if(count==0){
Toast toast=Toast.makeText(activity,"",Toast.LENGTH_LONG);
toast.setText("应用程序进入后台");
toast.show();//这种方式的toast可以去掉默认的前缀
}
}
之所以要定义计数器并且有一个加减的操作是因为,如果只是单纯使用两个生命周期方法判断的话会出现问题。比如两个AB页面之间跳转,如果不用计时器判断,就会出现A跳转到B之后也会有toast提示的现象,因为A页面跳转到B页面的时候会执行onActivityStopped方法。