前言:
伊隆·馬斯克 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秒
沒有留言:
張貼留言