利用Application監聽App處于前臺和后臺

之前有個需求,App從前臺切換到后臺,不需要做什么操作;從后臺切換到前臺,需要先驗證屏鎖密碼。于是乎,搜索了一下,“利用Application監聽App處于前臺和后臺”,找到了一個國外的big god的解決方案。不要問我是怎么找到的,做開發必備的技能,擅長檢索,也是一種能力。致謝steveliles

...

廢話不說了,直接上代碼。

<pre>

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){
        LogUtil.e("went foreground");
        for (Listener l : listeners) {
            try {
                l.onBecameForeground();
            } catch (Exception exc) {
                LogUtil.e("Listener threw exception!", exc);
            }
        }
    } else {
        LogUtil.e("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;
                LogUtil.e("went background");
                for (Listener l : listeners) {
                    try {
                        l.onBecameBackground();
                    } catch (Exception exc) {
                        LogUtil.e("Listener threw exception!", exc);
                    }
                }
            } else {
                LogUtil.e("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) {}

}

</pre>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,845評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Android中的前臺就是指用戶可見,后臺就是指用戶不可見。對于Activity來說,可以通過生命周期,監聽回到前...
    藍灰_q閱讀 3,679評論 0 2
  • 自從古老的iOS4以來,當用戶點擊home建的時候,你可以使你的APP們在內存中處于suspended(掛起)狀態...
    木易林1閱讀 3,203評論 1 4
  • 你離開了很久。 現在我的頭像是竇唯,半夜愛看婁燁的文藝片,循環最多的歌曲是你離開了南京從此沒有人和我說話。他們是你...
    陳鄉閱讀 180評論 0 2