1. 程式人生 > >Activity的生命週期注意事項

Activity的生命週期注意事項

一、生命週期執行順序

二、暫停

        當開啟一個半透明的activity時(例如以對話方塊的形式),之前的activity會被暫停,只要這個activity仍然被部分可見,之前的activity則一直處於Paused狀態。然而,一旦之前的activity被完全阻塞並不可見,它則會進入Stop狀態.
通常應該在onPause()回撥方法裡面做下面的事情:
        1、停止動畫或者是其他正在執行的操作,那些都會導致CPU的浪費.
        2、提交沒有儲存的改變,但是僅僅是在使用者離開時期待儲存的內容(例如郵件草稿).
        3、釋放系統資源,例如broadcast receivers, Camera,sensors (比如GPS), 或者是其他任何會影響到電量的資源。
        4、但是你不應該使用onPause()來儲存使用者改變的資料 (例如填入表格中的個人資訊) 到永久儲存(File或者DB)上;如果必須做一些繁重的工作,可以在onStop裡做

三、停止

1、Activity類提供了onStop()與onRestart()方法來允許在activity停止與重啟時進行呼叫。
2、系統會在activity stop的時候銷燬這個activity,它仍然會儲存View物件的狀態(比如EditText中的文字) 到一個Bundle中,並且在使用者返回這個activity時恢復他們。
3、在極端情況下,系統會直接殺死你的app程序,並且不執行activity的onDestroy()回撥方法, 因此你需要使用onStop()來釋放資源,從而避免記憶體洩漏。
4、因為我們會在onStop方法裡面做釋放資源的操作,那麼onDestory方法則是你最後去清除那些可能導致記憶體洩漏的地方。

四、恢復

        每次恢復activity時,系統會呼叫onResume()方法;所以,應該實現onResume()來初始化那些在onPause方法裡面釋放掉的元件,並執行那些activity每次進入Resumed state都需要的初始化動作 (例如開始動畫與初始化那些只有在獲取使用者焦點時才需要的元件)

五、onSaveInstanceState方法

1、Activity類提供了onStop()與onRestart()方法來允許在activity停止與重啟時進行呼叫。
2、系統會在activity stop的時候銷燬這個activity,它仍然會儲存View物件的狀態(比如EditText中的文字) 到一個Bundle中,並且在使用者返回這個activity時恢復他們。
3、在極端情況下,系統會直接殺死你的app程序,並且不執行activity的onDestroy()回撥方法, 因此你需要使用onStop()來釋放資源,從而避免記憶體洩漏。
4、因為我們會在onStop方法裡面做釋放資源的操作,那麼onDestory方法則是你最後去清除那些可能導致記憶體洩漏的地方。
5、當某個activity變得"容易"(即“未經你許可”時)被系統銷燬時,該activity的onSaveInstanceState()就會被執行。 那些被系統用來恢復之前狀態而儲存的資料被叫做 “instance state” ,它是一些存放在Bundle物件中的key-value pairs。
  (1)、當用戶按下HOME鍵時。
  (2)、長按HOME鍵,選擇執行其他的程式時。
  (3)、按下電源按鍵(關閉螢幕顯示)時。
  (4)、從activity A中啟動一個新的activity時。
  (5)、螢幕方向切換時,例如從豎屏切換到橫屏時。
  (6)、不包括主動的finish和按back按鍵
  onSaveInstanceState()方法只適合儲存瞬態資料, 比如UI控制元件的狀態, 成員變數的值等,而不應該用來儲存持久化資料,持久化資料應該當使用者離開當前的 activity時,在 onPause() 中儲存(比如將資料儲存到資料庫或檔案中)。說到這裡,還要說一點的就是在onPause()中不適合用來儲存比較費時的資料,所以這點要理解。
  如果想要系統資源發生改變以後不重新建立, 只需要配置android:configChanges=”orientation|screenSize”

六、啟動模式

1、standard(預設的模式)
        這種Activity將被建立並置於棧頂,和傳送intent的Activity處於同一個任務中。注:一般來講,安卓第三個虛擬鍵所列出的那些就是任務。
如果我們切換到另外一個應用然後再切回到Gallery,你會發現standard launchMode啟動的Activity仍然在Gallery任務的上面,導致在操作Gallery之前,我們必須首先結束這個額外的Activity。
撰寫郵件的Activity或者釋出社交網路狀態的Activity都是採用這種Activity的例子。
2、singleTop模式。
        它的表現幾乎和standard模式一模一樣,一個singleTop Activity 的例項可以無限多,唯一的區別是如果在棧頂已經有一個相同型別的Activity例項,Intent不會再建立一個Activity
這種啟動模式的用例之一就是搜尋功能,如果每次顯示搜尋結果的時候我們都啟動一個新的activity,10次搜尋10個activity,那樣當我們想返回最初的那個activity的時候需要按10次返回。
3、singleTask
        這種模式的Activity只允許在系統中有一個例項,需要android:taskAffinity=..."。如果系統中已經有了一個例項,singleTask Activity上面的所有Activity將以合適的方式自動銷燬,讓我們想要顯示的Activity處於棧頂,如果沒有,則會建立一個新的Activity並置放在合適的任務中。
郵件客戶端的收件箱或者社交網路的時間軸。這些Activity一般不會設計成擁有多個例項,singleTask可以滿足。
4、singleInstance
        這個模式非常接近於singleTask,具有全域性唯一性,即整個系統中只會存在一個這樣的例項,需要android:taskAffinity=""。區別在於持有這個Activity的任務中只能有一個Activity:即這個單例本身。
除非完全有必要,不然我不建議使用這種模式。