Android自 API 14开始引入了一个方法,即Application的
registerActivityLifecycleCallbacks
方法,用来监听所有Activity的生命周期回调。通过这个方法,我们可以轻松获取到当前运行的Activity
的实例,还可以判断应用是在前台运行还是后台运行。
我们先来看下面的一个简单代码块:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
ActivityManager.getInstance().setCurrentActivity(activity);
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
}
可能有人会有个疑问, ActivityManager
是个什么鬼东西来的,ok,我们现在看一下这个类的实现:
public class ActivityManager {
private static ActivityManager mInstance = new ActivityManager();
private WeakReference<Activity> mCurrentActivityWeakRef;
private ActivityManager() {
}
public static ActivityManager getInstance() {
return mInstance;
}
public Activity getCurrentActivity() {
if (mCurrentActivityWeakRef != null) {
return mCurrentActivityWeakRef.get();
}
return null;
}
public void setCurrentActivity(Activity activity) {
mCurrentActivityWeakRef = new WeakReference<>(activity);
}
}
这里使用饿汉式单例模式来弱引用保存了 Activity
的实例。这个实例保存下来可以说有非常多的用处,特别是在处理 Serivice
里面来触发对应 Activity
的跳转之类的需求。这里感谢一下技术小黑屋 ,提供了这个个非常有用的方法。
正如上面说, registerActivityLifecycleCallbacks
方法还可以帮助我们判断应用是处于前台运行还是后台运行。这个判断方法也很简单,直接看下面的代码:
public class MyApplication extends Application {
private int activityCounter = 0;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
activityCounter++;
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
activityCounter--;
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
public boolean getAppFrontRunning() {
return activityCounter>0;
}
}
想必大家都了解两个 Activity
之间的跳转的生命周期:
A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()
因为我们可以通过 Activity
的生命周期的追踪回调,对 activityCounter
进行简单的加减处理,从而只需要判断 activityCounter
是否大于0即可知道当前应用是否处于前台运行。
结语
综上所述, registerActivityLifecycleCallbacks
一个很好用的方法,但是如果你的应用需要兼容到 API 14版本以下,就不能采取这种方式。