1. 程式人生 > >ActivityLifecycleCallbacks,監聽前後臺狀態

ActivityLifecycleCallbacks,監聽前後臺狀態

結合自定義的Application,就可以輕鬆地實現監聽程式處於前臺還是後臺的需求。

public class ForegroundCallbacks implements Application.ActivityLifecycleCallbacks {
    public static final long CHECK_DELAY = 500;
    public static final String TAG = ForegroundCallbacks.class.getName();
    public interface Listener {
        public void
onBecameForeground()
; public void onBecameBackground(); } private static ForegroundCallbacks instance; private boolean foreground = false, paused = true; private Handler handler = new Handler(); private List<Listener> listeners = new CopyOnWriteArrayList<Listener>(); private
Runnable check; public static ForegroundCallbacks init(Application application){ if (instance == null) { instance = new ForegroundCallbacks(); application.registerActivityLifecycleCallbacks(instance); } return instance; } public static
ForegroundCallbacks get(Application application)
{ if (instance == null) { init(application); } return instance; } public static ForegroundCallbacks get(Context ctx){ if (instance == null) { Context appCtx = ctx.getApplicationContext(); if (appCtx instanceof Application) { init((Application)appCtx); } throw new IllegalStateException( "Foreground is not initialised and " + "cannot obtain the Application object"); } return instance; } public static ForegroundCallbacks get(){ if (instance == null) { throw new IllegalStateException( "Foreground is not initialised - invoke " + "at least once with parameterised init/get"); } return instance; } public boolean isForeground(){ return foreground; } public boolean isBackground(){ return !foreground; } public void addListener(Listener listener){ listeners.add(listener); } public void removeListener(Listener listener){ listeners.remove(listener); } @Override public void onActivityResumed(Activity activity) { paused = false; boolean wasBackground = !foreground; foreground = true; if (check != null) handler.removeCallbacks(check); if (wasBackground){ L.d ("went foreground"); for (Listener l : listeners) { try { l.onBecameForeground(); } catch (Exception exc) { L.d ("Listener threw exception!:"+exc.toString()); } } } else { L.d ("still foreground"); } } @Override public void onActivityPaused(Activity activity) { paused = true; if (check != null) handler.removeCallbacks(check); handler.postDelayed(check = new Runnable(){ @Override public void run() { if (foreground && paused) { foreground = false; L.d ("went background"); for (Listener l : listeners) { try { l.onBecameBackground(); } catch (Exception exc) { L.d ("Listener threw exception!:"+exc.toString()); } } } else { L.d ("still foreground"); } } }, CHECK_DELAY); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} @Override public void onActivityStarted(Activity activity) {} @Override public void onActivityStopped(Activity activity) {} @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} @Override public void onActivityDestroyed(Activity activity) {} }