Android之Activity生命週期探索
Task & Back Stack
Android中的Activity全都歸屬於Task管理,Task是多個Activity的集合,這些Activity按照啓動順序排隊存入一個棧(Back Stack)。
Android默認會爲每個App維持一個Task來存放該App所有的Activity,默認Task的name爲該App的packagename。
可以在AndroidManifest.xml中申明Activity的taskAffinity屬性來自定義Task,但不建議使用,因爲如果其他App也申請了相同的Task,有可能啓動到我們的Activity帶來安全問題。
Activity生命週期回調方法
onCreate():在Activity第一次創建的時候調用,在這個回調方法中完成Activity的初始化操作,比如加載佈局,初始化控件,綁定監聽事件等;
onStart():在Activity由不可見到可見的時候調用;
onResume():在Activity準備好和用戶交互的時候調用,此時的Activity一定唯一Back Stack棧頂,並且處於running運行狀態;
onPause():在系統準備去啓動或者恢復另一個Activity的時候調用;
onStop():在Activity完全不可見的時候調用;
onDestroy():在Activity被銷燬之前調用,之後Activity的狀態將變爲銷燬狀態;
onRestart():在Activity由停止狀態變爲運行狀態之前調用,Activity重啓時調用;
代碼下Activity生命週期展示
//創建到銷燬的生命週期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onStop() ——> onDestroy()
//從啓動到後臺,再到前臺的生命週期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onStop() ——> onRestart() ——> onStart() ——> onResume()
//從啓動到失去焦點,再到獲取到焦點的生命週期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onResume()
//停止狀態(Stopped)Activity被完全遮擋,但保留所有狀態和成員信息
Activity的內部調用過程
打開一個新的Activity實例的時候系統依次調用onCreate()、onStart()、onResume()然後開始running運行狀態;
running的時候Activity被覆蓋系統調用onPause()方法,接下來它有三個選擇;
1.用戶返回到該Activity就調用onResume()方法重新running運行狀態;
2.用戶回到桌面或者打開其他Activity就會調用onStop()進入停止狀態;
3.系統內存不足或者擁有更高權限的應用需要內存,該Activity的進程可能會被系統回收,想要重新打開就必須重新創建。如果用戶返回到onStop()狀態Activity,系統會調用onRestart()、onStart()、onResume()然後重新running運行,在Activity結束或者被系統殺死之前會調用onDestroy()方法釋放掉所有佔用的資源。
Activity的四種狀態
活動狀態(Active/Running)Activity處於界面最頂端,獲取焦點;
暫停狀態(Paused)Activity失去焦點,但對用戶可見;
停止狀態(Stopped)Activity被完全遮擋,但保留所有狀態和成員信息;
非活動狀態(Killed)Activity被停止;
Activity生命週期的嵌套循環
1.完整生存期:在onCreate()調用和onDestroy()調用之間發生;
2.可見生存期:在onStart()調用和onStop()調用之間發生,系統會在Activity的整個生命週期內多次調用onStart()和onStop(),因爲Activity可能會在顯示和隱藏之間不斷地來回切換;
3.前臺生存期:在onResume()調用和onPause()調用之間發生,因爲這個狀態可能會經常發生轉換,爲了避免切換遲緩引起的用戶等待,這兩個方法中的代碼應該相當的輕量化;
Activity生命週期交互設計思想
1.多個Activity的生命週期交互
//啓動MainActivity
MainActivity:onCreate() ——> onStart() ——> onResume()
//通過MainActivity啓動SecondActivity
MainActivity:onPause()
SecondActivity:onCreate() ——> onStart() ——> onResume()
MainActivity:onStop()
//在SecondActivity點擊Back鍵返回MainActivity
SecondActivity:onPause()
MainActivity:onRestart() ——> onStart() ——> onResume()
SecondActivity:onStop ——> onDestroy()
2.爲什麼要先暫停當前顯示的Activity?
爲什麼MainActivity啓動SecondActivity先使用MainActivity的onPause()方法然後再去打開SecondActivity呢?
爲什麼不在SecondActivity啓動完成後再調用MainActivity的onPause()方法呢?
這樣設計的原因是爲了防止當MainActivity進行着一些功能的時候不對其所在的Activity進行暫停就進入下一個Activity進行操作,很可能因爲功能重疊造成很糟糕的用戶體驗。所以我們在一個Activity進入到另外一個Activity之前要先調用前一個Activity的onPause()方法將這個Activity所有活動暫停後再去執行下一個Activity。
3.爲什麼要先執行要打開Activity的onCreate()、onStart()、onResume()方法?
這個Google爲我們做的一個保護的機制,假設我們在啓動SecondActivity的時候出現一些異常信息被crush掉了。如果我們在第一個Activity的onPause()方法之後直接調用onStop方法,那麼這個Activity就變成不可見。那麼現在這個時候第一個Activity處於不可見狀態,第二個Activity被crush掉了,整個應用程序就處於黑屏的狀態。
所以Google爲了針對這種情況設計的是MainActivity啓動SecondActivity先將MainActivity暫停onPause了後啓動SecondActivity的生命週期,當SecondActivity完全啓動後再調用MainActivity的onStop方法將它置於後臺,那麼這個時候顯示的就是SecondActivity。
Crash:因爲程序或者各種原因而導致的程序意外退出,俗稱"閃退";