show code block

2017年10月6日 星期五

Android元件(ActivityLifecycleCallbacks) — 逾時登出製作 (二)

前言:

伊隆·馬斯克 space x 的創辦人,曾經說過把事情簡化的重要性。

像是把一件不可能的事情,中間的步驟不斷分解簡化。
就像他提出的第一性原理
就是讓我們把目光從那些別人做的事上挪開,不管做什麼選擇,都以最根本的那個原則為參照點,不斷用那個參照點為自己糾偏。

 上一次做逾時登出也是用這方法,把每一個想得到的情況都包含進去,在不斷簡化。

但在簡化的過程,其實也可以抬頭看一下有沒有其他平行更好的方法。

剛剛我發現了一個更快的方式,一個方法就概括監控所有Activity的方法
 ActivityLifecycleCallbacks
 https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html

 ActivityLifecycleCallbacks

他能瞬間監控所有的activity,也能在其中做一些變化,像是ToolBar
關於ToolBar我是參考
http://www.jianshu.com/p/75a5c24174b2

這篇讓你實現每個頁面實現toolbar的方式。

有興趣可以連過去看看,這邊只講逾時登出。



 重點程式碼:

Application內 可以直接使用ActivityLifecycleCallbacks
public class MyApplicationTwo extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                
            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

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

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }
}

 

上述就和Activity的生命週期幾乎一模一樣,在每個方法內打上Log。

設置兩三個Activity就可以做測試了!

在逾時登出的案子裡,我們還原一下裡面的CustomApplication這個方法
http://nikeru8.blogspot.tw/2017/09/android.html

把整個App關於逾時登出的部分全部砍掉,包含情境A情境B


這裡一行就完成ActivityLifecycleCallbacks
public class CustomApplication extends Application {

    private static final String TAG = "CustomApplication";
    private static long PAUSE_TIME = 0;//暫停的時間點
    private static long RESTART_TIME = 0;//喚醒的時間點

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                Log.d(TAG, "onActivityCreated");
            }

            @Override
            public void onActivityStarted(Activity activity) {
                Log.d(TAG, "onActivityStarted");
            }

            @Override
            public void onActivityResumed(Activity activity) {
                Log.d(TAG, "onActivityResumed");
                if (PAUSE_TIME != 0) {
                    RESTART_TIME = System.currentTimeMillis();
                    long totalTime = RESTART_TIME - PAUSE_TIME;
                    Log.d("checkpoint", "checkpoint PAUSE_TIME = " + PAUSE_TIME);
                    Log.d("checkpoint", "checkpoint RESTART_TIME = " + RESTART_TIME);
                    Log.d("checkpoint", "checkpoint = " + totalTime);
                }

            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.d(TAG, "onActivityPaused");
            }

            @Override
            public void onActivityStopped(Activity activity) {
                Log.d(TAG, "onActivityStopped");
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
                Log.d(TAG, "onActivitySaveInstanceState");
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                Log.d(TAG, "onActivityDestroyed");
            }
        });
    }
}

 
這就和Activity的生命週期一模一樣。
我在喚醒activity的Resume部分,寫了方法。

假如停止時間點有值,喚醒時,拿PAUSE_TIME(暫停的時間點)比較一下 RESTART_TIME (喚醒的時間點)
long 每一千個單位 等於 一秒。
相減下來如果1204,就等於app暫停了1.204



好啦,試試看自己的App能不能有逾時登出的效果吧!
以下是我的Log
checkpoint 就是相扣的單位 2934
所以是2.934


沒有留言:

張貼留言

協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...