【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的生命週期裡的值就會像下面這樣:
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()
//原始碼位於Application類中
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本身的實現中。
二、實現
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++;
//如果mFinalCount ==1,說明是從後臺到前臺
if (mFinalCount == 1){
//說明從後臺回到了前臺
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
mFinalCount--;
//如果mFinalCount == 0,說明是前臺到後臺
if (mFinalCount == 0){
//說明從前臺回到了後臺
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
}