PS:寫一發關於Activity的生命週期,也算是面試的重點內容.面試
學習內容:ide
1.Activity的生命週期函數
2.面對多種狀況的時候Activity的生命週期學習
3.onSaveInstanceState()方法的調用spa
1.Activity的生命週期
code
Activity的生命週期是Android中須要掌握的重點部分..也就此簡單的介紹一下..順便本身也捋一捋概念上的東西..對象
返回棧的概念和流程圖:blog
Android中Activity的管理是由一個棧區進行管理的.在默認狀況下,咱們每次啓動一個新的Activity的時候.他都會在返回棧中入棧.而且處於棧頂的位置.而咱們每次在退出一個Activity的時候,或者是使用finish函數的時候.當前的Activity會進行出棧操做.那麼棧頂位置就成爲了前一個Activity系統老是會將棧頂位置的Activity顯示給用戶.生命週期
這個流程圖就是Activity的管理方式..遊戲
Activity的相關狀態
i.運行狀態
運行狀態的Activity.運行狀態的Activity通常都是直接與用戶進行交互的Acticity.也是處於棧頂位置的Activity.系統通常狀況下是不會回收這個Activity的.
ii.暫停狀態
暫停狀態的Activity再也不處於棧頂位置,可是仍然處於可見狀態的時候,這個Activity也就進入了暫停狀態.這種的Activity仍是挺常見的.通常咱們在操做一個Activity的時候.好比說系統彈出了一個新的對話框.這個對話框屬於一個新的Activity.可是這個新的Activity並無徹底的覆蓋住了屏幕.那麼原來的那個Activity這個時候就處於了暫停狀態.暫停狀態的Activity系統一版狀態下也是不會主動去回收的.(雖然活動暫停,可是仍然處於可見狀態.若是進行了回收,會使得用戶的體驗性差).可是並不表明任何狀況下都不會被回收.
iii.中止狀態
中止狀態的Activity.中止狀態的Activity也再也不處於棧頂位置.而且已經徹底再也不可見了.雖然系統仍然保存着相應的狀態和變量.可是一旦其餘應用也須要使用內存的時候,那麼處於中止狀態下的Activity也就會被系統自動進行回收了.
iv.銷燬狀態
通常狀況下Activity在棧區中被移除的時候,Activity也就進入了銷燬狀態.等待系統的回收,釋放資源和內存.
Activity的生存週期
i.onCreate()方法.
這個方法在Activity在第一次被建立的時候進行調用.一些相關的初始化操做都在這個方法內部完成.
ii.OnDestory()
這個方法是與onCreate()方法是相互對應的.這個方法用於銷燬Activity.釋放資源.
這兩個方法之間的Activity是一個完整的生存週期
iii.onStart()
這個方法使得Activity由不可見狀態成爲可見狀態.
iv.onStop()
與onStart()方法造成對應關係.當活動徹底不可見的時候進行調用.
這兩個個方法之間的Activity是一個可見的生命週期
v.onResume()
這個方法表示當前的Activity已經能夠與用戶進行交互了.活動處於棧頂狀態.
vi.onPause()
與onResume()方法造成對應關係.這個方法在系統準備去啓動或者恢復另外一個活動的時候調用。咱們一般會在這個方法中將一些消耗CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度必定要快,否則會影響到新的棧頂活動的使用。(注:onPause()方法調用以後不必定會去調用onStop()方法.取決於新Activity的顯示方式,在下面會作出解釋).
這兩個方法之間的Activity是一個前臺生存週期,也就是說當前的Activity能夠與用戶進行交互.
vii.onRestart()
這個方法的調用是當Activity從中止狀態到運行狀態時須要調用的方法.
上一張流程圖..
以上就是關於Activity的生命週期的一個簡單的介紹..下面來看一看相關的實例.
2.面對多種狀況下Activity的生命週期流程
當MainActivity被建立的時候方法的調用過程:
MainActivity的建立會調用的方法:
onCreate();
onStart();
onResume();
當咱們點擊第一個按鈕的時候,開啓一個新的Activity(咱們稱爲Activity1).當Activity1被建立的時候方法的調用過程是這樣的.
首先Activity1調用的方法以下:
Activity1的回調方法以下:
onCreate();
onStart();
onResume();
MainActivity的回調方法:
MainActivity被Activity1覆蓋以後回調方法的調用
onPause();
onStop();
這時MainActivity已經執行了上面的一些方法..
當咱們退出Activity1的時候.MainActivity的執行方法以下:
當咱們退出Activity1.回到MainActivity的時候方法的調用
onRestart();
onStart();
onResume();
這裏咱們能夠看到onCreate()方法就不會被執行了.這種狀況的前提是咱們手機的內存空間是充足的.
咱們在來看另一種狀況,好比說咱們開啓了一個應用,而後進入了一個Activity界面中,而後咱們這時點擊了home鍵進行了退出操做,而且沒有清理手機的內存.這個時候咱們去玩手機遊戲,而且這個手機遊戲會佔用至關多的內存空間.而後咱們玩完以後,若是咱們再次返回前一個咱們開啓的那個應用的時候,他仍然會顯示那個Activity的頁面.那麼這個時候這個Activity又執行了哪些方法呢?
咱們知道手遊是至關耗費內存的.按照上面的那個流程圖來看..若是其餘有優先級的應用須要使用內存空間的時候,而且系統空間並非很足的時候.就須要殺掉進程.釋放那些已經再也不顯示的Activity.也就是處於onStop()狀態的時候.所以當咱們若是再次回到那個應用的Activity的界面的時候.就須要從新調用onCreate()方法對Activity進行從新建立.而後再去執行onStart().onResume()。
咱們接着看上面的另一種狀況,就是咱們去點擊第二個按鈕的時候,彈出的對話框Activity(這裏稱爲Activity2).咱們來看看這種狀況.當咱們點擊第二個按鈕的時候Activity2的回調方法過程.
Activity2的回調方法:
onCreate();
onStart();
onResume();
Activity2的建立仍然沒有什麼太大的區別..仍是這三個方法的調用.那麼咱們來看看MainActivity的回到方法:
MainActivity的回調方法:
onPause();
這裏咱們能夠看到MainActivity只是調用了一個方法.onPause()方法.並無去調用onStop()方法了.由於MainActivity仍然處於一個可見的狀態.雖然咱們啓動了一個新的Activity,可是Activity2並無徹底的覆蓋MainActivity,所以MainActivity只須要去調用onPause()方法.當咱們點擊回退的時候,MainActivity只會去調用onResume()方法了.
3.onSaveInstanceState()方法
前面咱們已經說過,當一個活動進入到了中止狀態,是有可能被系統回收的。那麼若是應用中有一個活動A,用戶在活動A的基礎上啓動了活動B,活動A就進入了中止狀態,這個時候因爲系統內存不足,將活動A 回收掉了,而後用戶按下Back 鍵返回活動A,會出現什麼狀況呢?其實仍是會正常顯示活動A的,只不過這時並不會執行onRestart()方法,而是會執行活動A的onCreate()方法,由於活動A 在這種狀況下會被從新建立一次。
可是這樣會致使的狀況就是,這個新建立的Activity是沒法保存用戶上次輸入的相關信息的.好比說,用戶在一個文本框中輸入了相關內容而後走了上面的狀況.被回收以後,只能從新進行建立,那麼原來用戶在文本框中輸入的相關內容也就不復存在了.這樣就會使得用戶的體驗性較差.那麼咱們如何去記錄用戶上一次的操做的相關信息呢?那麼就是使用onSaveInstanceState()方法了.
咱們知道Activity建立的時候會調用onCreate()方法.onCreate()方法中存在一個Bundle對象.默認狀況下,這個對象的數據是空的.可是若是咱們須要保存上一次用戶的相關操做,一些數據信息,那麼就須要使用這個對象了.
咱們只須要這樣..
@Override protected void onSaveInstanceState(Bundle State) { super.onSaveInstanceState(outState); String data = "須要保存的數據"; State.putString("data_key", data); }
經過這個方法將數據信息進行保存,那麼恢復的時候就能夠這樣..
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); if (savedInstanceState != null) { String data = savedInstanceState.getString("data_key"); } //取出數據以後,在這裏進行恢復. }
這樣就能夠經過使用這個方法保存上次用戶輸入的一些數據信息,若是在面對Activity須要從新建立的時候,將數據進行取出,而後從新賦給Activity這樣就可使得用戶上次輸入的數據會得以保存.使得Activity對用戶的體驗更加的良好,,