【Android】App应用前后台切换的一种监听方法
Android本身并没有提供监听App的前后台切换操作的方法。最近看到一种简单巧妙的方法来监听前后台,这里分享记录一下。
一、Activity生命周期
我们知道在Android中,两个Activity,分别为A和B。假设此时A在前台,当A启动B时,他们俩之间的生命周期关系如下,可以参考之前的这篇文章【Android】Activity与Fragment的生命周期的关系:
A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()
也就是说B的onStart()方法是在A的onStop()方法之前执行的,我们可以根据这点来做文章。在所有Activity的onStart()和onStop()方法中进行计数,计数变量为count,在onStart中将变量加1,onStop中减1。
那么这个count在整个App的生命周期里的值就会像下面这样:
1 2 3 4 5 6
| count 2| _ _ _ _ 1| ____| |___| |___| |___| |____ 0| ___| |___ ===========================================> 时间 a b c d
|
横轴表示时间,纵轴表示count的值。那么a、b、c、d四个时间点发生的事情如下:
- a点就是启动了应用;
- b点是Activity_A启动了另一个Activity_B;
- c点是Activity_B启动了另一个Activity_C,后面以此类推;
- d点是应用切换到了后台;
从上面的情况看出,可以通过对count计数为0,来判断应用被从前台切到了后台。同样的,从后台切到前台也是类似的道理。具体实现看后面的代码。
具体的实现中,我们可以实现一个BaseActivity,然后让其他所有Activity都继承自它,然后在生命周期函数中做相应的检测。还有更简单的方法,Android在API 14之后,在Application类中,提供了一个应用生命周期回调的注册方法,用来对应用的生命周期进行集中管理,这个接口叫registerActivityLifecycleCallbacks()
,可以通过它注册自己的ActivityLifeCycleCallback,每一个Activity的生命周期都会回调到这里的对应方法。
1 2 3 4 5 6 7 8 9 10
| 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); }
|
其实这个注册方法的本质和我们实现BaseActivity是一样的,只是将生命周期的管理移到了Activity本身的实现中。
二、实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| public class TheApplication extends Application {
private int mFinalCount;
@Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override public void onActivityStarted(Activity activity) { mFinalCount++; if (mFinalCount == 1){ } }
@Override public void onActivityResumed(Activity activity) { }
@Override public void onActivityPaused(Activity activity) { }
@Override public void onActivityStopped(Activity activity) { mFinalCount--; if (mFinalCount == 0){ } }
@Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { }
@Override public void onActivityDestroyed(Activity activity) { } }); } }
|
参考资料