1:ActivityLifecycleCallbacks 是Application 內部的 一個介面,在Activity的每一個生命周期都對應ActivityLifecycleCallbacks介面中一個方法,比如 onActivityCreated 的回呼是在 Activity的 onCreate方法中呼叫 getApplication().dispatchActivityCreated(this, savedInstanceState) 來完成對Activity生命周期的監聽,
2:要使用這個介面,一般我們在自定義的Application(比如 MyApplication)的 onCreate()中 registerActivityLifecycleCallbacks()注冊這個介面就可以使用了
3:ActivityLifecycleCallbacks介面函式回呼原始碼分析
4:使用場景
使用場景一 :管理Activity堆疊
我們可以先定義一個變數Stack 然后在介面onActivityCreated() 函式中 將Activity 壓入堆疊中Stack.push(activity) ,在 onActivityDestoryed()函式中 將Activity從堆疊中移除 Stack.pop(),也可以在應用程式退出時,清楚所有Activity
使用場景二 :判斷 App前后臺狀態
判斷應用是否在后臺運行,針對前后臺運行會做一些處理,比如提示用戶應用運行在后臺、以及應用前后臺切換回呼通知等,利用通過監聽回呼方法 onActivityStarted與onActivityStopped兩個方法,結合Activity Stack 中Activity數量 來判斷應用前后臺,
使用場景三:應用新開行程假重啟處理(低記憶體回收、修改權限)
應用在低記憶體的情況下退出重新啟動,并不會執行正常的啟動流程,而是創建新的行程,直接還原上一次的操作頁面,這樣會導致頁面堆疊資訊丟失,頁面顯示以及回傳跳轉例外,
比如:正常的啟動流程時:SplashActivity ----loginActivity ----MainActivity
在低記憶體重新開行程情況下,會直接啟動LoginActivity. 這樣就會出現頁面資訊丟失,解決方案就是我們可以通過監聽回呼方法 onActivityCreated,判斷應用啟動的第一個 Activity 頁面是否為 SplashActivity ,如果不是,則強制啟動SplashActivity 來執行正常的啟動流程,
使用場景四:獲取當前運行頁面
通過監聽回呼方法 onActivityResumed,設定當前 Activity 頁面
使用場景五:保存恢復狀態值 savedInstanceState
Activity 例外退出經常需要保存恢復一些資料,ActivityLifecycleCallbacks 實作資料保存恢復也是比較簡單的, 通過監聽回呼方法onActivityCreated與onActivitySaveInstanceState保存恢復狀態值
使用場景六:頁面分析統計埋點,頁面資訊統計
使用場景七:給App設定指紋解鎖或者手勢密碼解鎖,例如,App切換至后臺或者行程關閉,時間如果超過20sec,App再次切換至前臺或者重新打開,要讓用戶驗證指紋或者手勢密碼,驗證通過的話才能進入home頁,當然,具體的時間長短,后端可配
此場景最重要的就是 :記錄App切換至后臺或行程被殺死的時間點是解決問題的關鍵點一,假設這個時間點是T1;記錄App再次切換至前臺或者重新打開的時間點是解決問題的關鍵點二,假設這個時間點是T2,只要能準確的記錄T1和T2,上述需求就迎刃而解(假設后端配置的時間間隔為timeSpan),
思路:
監聽T1和T2的基本思路
(1).寫一個基類BaseActivity,所有新創建的Activity全都繼承基類;
(2).在基類中定義一個int變數activeNum,記錄當前存活的Activity個數;
(3).回呼基類的onResume()方法,activeNum就加1,回呼基類的onStop()方法, activeNum就減1;
(4).當activeNum的值減到0,說明App進入后臺或者被Kill,記錄時間點T1并保存.因為App不同頁面間切換都會走onResume(),所以在記錄時間點T1的同時,保存一個標記checkTimeFlag, 置為true,這個標記用來判斷下次呼叫onResume()時是否為T2時間點
(5).在基類的onResume()方法里獲取并判斷標記checkTimeFlag,true的話,獲取App切換到前臺或者重新打開的時間點T2,檢查是否超時,超時的話,將標記checkTimeFlag置為false并驗證用戶指紋或者手勢密碼;
(6).配置的時間間隔timeSpan可以在啟動頁從后端獲取,每次走啟動頁的時候重繪一次,當然個別場景會有些延遲,例如,用戶從頁面A進入后臺,timeSpan修改了,但是用戶切回前臺,判斷時使用的timeSpan還是上次的,不是修改后的,這種場景不走啟動頁重繪timeSpan,如果非要實時的話,其實可以把介面請求寫在onResume()里,獲取T2之后,請求介面獲取timeSpan,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398030.html
標籤:AI
上一篇:Android include
