Android判斷APP是否在前臺運行

mip33 9年前發布 | 3K 次閱讀 Java Android

APP開發中經常會遇到這種需求,需要檢查當前的APP是不是可見的,比如,如果是可見的就維持一個socket長連接,如果切到后臺不可見了,就斷開這個連接。Android本來并不允許APP去監聽home鍵事件,所以我們沒發像iOS那樣通過監聽home鍵事件來做對應的處理。不過還好Android的Activity的生命周期給我們提供了一種解決這個問題的方法,我們只需要在每個Activity的onStart和onStop中去維持一個計數,如果這個數值大于0,就表示我們的APP還有Activity是在前臺運行的,等于0,就表示APP已經被切換到后臺。

說到這里你可能要想,是不是直接修改我的APP的BaseActivity,在基類里做計數的事情就好了。當然,這是最直接的一種方法。但是,這種方法需要你去修改自己的基類代碼,侵入性太強,我不是很喜歡這種方法。更好的方式是使用sdk提供的Application.ActivityLifecycleCallbacks接口。下面的代碼展示了如何實現這個接口:

public class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { 
    private int foregroundActivities;
    private boolean hasSeenFirstActivity;
    private boolean isChangingConfiguration;
    @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    }

@Override public void onActivityStarted(Activity activity) {
    mForegroundActivities++;
    if (hasSeenFirstActivity && foregroundActivities == 1 && !isChangingConfiguration) {
        applicationDidEnterForeground(activity);
    }
    hasSeenFirstActivity = true;
    isChangingConfiguration = false;
}
@Override public void onActivityResumed(Activity activity) {
}

@Override public void onActivityPaused(Activity activity) {
}

@Override public void onActivityStopped(Activity activity) {
    foregroundActivities--;
    if (foregroundActivities == 0) {
        applicationDidEnterBackground(activity);
    }
    isChangingConfiguration = activity.isChangingConfigurations();
}

@Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}

@Override public void onActivityDestroyed(Activity activity) {
}

}</pre>
實現了自己的類之后,就可以調用Application的registerActivityLifecycleCallback方法,將我們的類MyActivityLifecycleCallbacks注冊進去,這樣就可以實現對Activity生命周期的監聽了。

 本文由用戶 mip33 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!