傳送門
Activity生命周期
Activity最全面詳解
一個Activity的啟動順序:
onCreate()——>onStart()——>onResume()
當另一個Activity啟動時:
第一個Activity onPause()——>第二個Activity onCreate()——>onStart()——>onResume()
——>第一個Activity onStop()
當返回到第一個Activity時:
第二個Activity onPause() ——> 第一個Activity onRestart()——>onStart()——>onResume()
——>第二個Activity onStop()——>onDestroy()
一個完整的A和B,再返回A的路線圖
我們需要注意下面幾點:
一個Activity的銷毀順序:
(情況一)onPause()——><Process Killed>
(情況二)onPause()——>onStop()——><Process Killed>
(情況三)onPause()——>onStop()——>onDestroy()使用app的時候,不會因為有來電通話或者切換到其他app而導致程序crash。
用戶沒有激活某個組件時不會消耗寶貴的系統資源。
離開app并且一段時間后返回,不會丟失用戶的使用進度。
設備發生屏幕旋轉時不會crash或者丟失用戶的使用進度。
下面的課程會介紹上圖所示的幾個生命狀態。然而,其中只有三個狀態是靜態的,這三個狀態下activity可以存在一段比較長的時間。(其它幾個狀態會很快就切換掉,停留的時間比較短暫)
- Resumed:該狀態下,activity處在前臺,用戶可以與它進行交互。(通常也被理解為"running" 狀態)
- Paused:該狀態下,activity的部分被另外一個activity所遮蓋:另外的activity來到前臺,但是半透明的,不會覆蓋整個屏幕。被暫停的activity不再接受用戶的輸入且不再執行任何代碼。
- Stopped:該狀態下, activity完全被隱藏,對用戶不可見??梢哉J為是在后臺。當stopped, activity實例與它的所有狀態信息(如成員變量等)都會被保留,但activity不能執行任何代碼。
其它狀態 (Created與Started)都是短暫的,系統快速的執行那些回調函數并通過執行下一階段的回調函數移動到下一個狀態。也就是說,在系統調用onCreate(), 之后會迅速調用onStart(), 之后再迅速執行onResume()。以上就是基本的activity生命周期。
銷毀Activity
activity的第一個生命周期回調函數是 onCreate(),它最后一個回調是onDestroy()當收到需要將該activity徹底移除的信號時,系統會調用這個方法。
大多數 app并不需要實現這個方法,因為局部類的references會隨著activity的銷毀而銷毀,并且我們的activity應該在onPause()與onStop()中執行清除activity資源的操作。然而,如果activity含有在onCreate調用時創建的后臺線程,或者是其他有可能導致內存泄漏的資源,則應該在OnDestroy()時進行資源清理,殺死后臺線程。
@Override
public void onDestroy() {
super.onDestroy(); // Always call the superclass
// Stop method tracing that the activity started during onCreate()
android.os.Debug.stopMethodTracing();
}
Note: 除非程序在onCreate()方法里面就調用了finish()方法,系統通常是在執行了onPause()與onStop() 之后再調用onDestroy() 。在某些情況下,例如我們的activity只是做了一個臨時的邏輯跳轉的功能,它只是用來決定跳轉到哪一個activity,這樣的話,需要在onCreate里面調用finish方法,這樣系統會直接調用onDestory,跳過生命周期中的其他方法。
暫停與恢復Activity
在正常使用app時,前端的activity有時會被其他可見的組件阻塞(obstructed),從而導致當前的activity進入Pause狀態。例如,當打開一個半透明的activity時(例如以對話框的形式),之前的activity會被暫停。 只要之前的activity仍然被部分可見,這個activity就會一直處于Paused狀態。
然而,一旦之前的activity被完全阻塞并不可見時,則其會進入Stop狀態(將在下一小節討論)。
activity一旦進入paused狀態,系統就會調用activity中的onPause()方法, 該方法中可以停止不應該在暫停過程中執行的操作,如暫停視頻播放;或者保存那些有可能需要長期保存的信息。如果用戶從暫停狀態回到當前activity,系統應該恢復那些數據并執行onResume()方法。
Note: 當我們的activity收到調用onPause()的信號時,那可能意味者activity將被暫停一段時間,并且用戶很可能回到我們的activity。然而,那也是用戶要離開我們的activtiy的第一個信號。
Figure 3. 當一個半透明的activity阻塞activity時,系統會調用onPause()方法并且這個activity會停留在Paused 狀態(1). 如果用戶在這個activity還是在Paused 狀態時回到這個activity,系統則會調用它的onResume() (2).
暫停Activity
當系統調用activity中的onPause(),從技術上講,意味著activity仍然處于部分可見的狀態.但更多時候意味著用戶正在離開這個activity,并馬上會進入Stopped state. 通常應該在onPause()回調方法里面做以下事情:
停止動畫或者是其他正在運行的操作,那些都會導致CPU的浪費.
提交在用戶離開時期待保存的內容(例如郵件草稿).
釋放系統資源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何會影響到電量的資源。
Note:當activity處于暫停狀態,Activity實例是駐留在內存中的,并且在activity 恢復的時候重新調用。我們不需要在恢復到Resumed狀態的一系列回調方法中重新初始化組件。
停止與重啟Activity
恰當的停止與重啟我們的activity是很重要的,在activity生命周期中,他們能確保用戶感知到程序的存在并不會丟失他們的進度。在下面一些關鍵的場景中會涉及到停止與重啟:
更多內容:
http://www.lxweimin.com/p/3dfb4d035b2b
相信不少朋友也已經看過這個流程圖了,也基本了解了Activity生命周期的幾個過程,我們就來說一說這幾個過程。
1.啟動Activity:系統會先調用onCreate方法,然后調用onStart方法,最后調用onResume,Activity進入運行狀態。
2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。
3.當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會調用onResume方法,再次進入運行狀態。
4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居后臺:系統會先調用onPause方法,然后調用onStop方法,進入停滯狀態。
5.用戶后退回到此Activity:系統會先調用onRestart方法,然后調用onStart方法,最后調用onResume方法,再次進入運行狀態。
6.當前Activity處于被覆蓋狀態或者后臺不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,而后用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。
7.用戶退出當前Activity:系統先調用onPause方法,然后調用onStop方法,最后調用onDestory方法,結束當前Activity。