0.前言
项目中经常会遇到判断App是否工作在后台的情景,除了判断runningTasks这种方法,其实有一种更加优雅的方法,就是使用ActivityLifecycleCallbacks。
1.ActivityLifecycleCallbacks
ActivityLifecycleCallbacks其实是一个接口,如下所示:
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);
}
看方法名字就很清晰的知道,它定义了App内所有的Activity从创建到销毁的回调方法。我们使用的时候实现这个接口,然后在我们自定义的Application调用初始化。所有 Activity 的生命周期都会回调上面对应的方法。
2.判断App是否在前台后台
下面这个工具类原理是通过统计所有Activity回调onStart和onStop的次数关系,调用最后面的两个static方法即可判断App是处于前台还是后台。大家有兴趣可以结合代码逻辑和Activity的生命周期进行各种场景下的验证。
/**
* Created by calvin on 2017/7/12.
*/
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
public class LifeHandler implements Application.ActivityLifecycleCallbacks {
private static boolean isAppInForeground;
private static int resumed;
private static int paused;
private static int started;
private static int stopped;
public LifeHandler() {
resumed = 0;
paused = 0;
started = 0;
stopped = 0;
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
if (isAppShowFromBackground()) {
isAppInForeground = true;
}
++started;
}
@Override
public void onActivityResumed(Activity activity) {
++resumed;
}
@Override
public void onActivityPaused(Activity activity) {
++paused;
}
@Override
public void onActivityStopped(Activity activity) {
++stopped;
if (isAppInBackground()) {
isAppInForeground = false;
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
private static boolean isAppShowFromBackground() {
return started == stopped;
}
//外部调用
public static boolean isAppInForeground() {
return isAppInForeground;
}
public static boolean isAppInBackground() {
return started == stopped;
}
}
然后我们只需要在Application里进行初始化并设置接口即可。
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new LifeHandler());
}
}
方法参数中的Activity可以让我们知道到底是哪个Activity在进行生命周期的回调,可以用来做很多事情。比如大名鼎鼎的内存泄漏检测工具LeakCanary就是使用这个接口来监测所有调用了onDestory方法,并将其放入监测队列,后台监测若继续存在这个实例就调用GC,若继续存在就查看内存快照并计算出到GC Roots的最短引用路径并打印Log让人们看到内存泄漏的发生。到底怎么用就看你自己的需求啦。只需要注意这个接口的使用需要API14+即可。