Activity生命週期相關

Activity的子類中兩個重要的方法

     onCreate(Bundle): 初始化你的activity,使用setContentView(int) 來給activity設置UI,使用findViewById(int)來獲取UI中的widgets。
     onPause(): 當用戶離開這個acitivty時,用戶的所有改變(change)在這裏應該被保存。


Activity的生命週期(Lifecycle)

     要注意的是,以下說得kill/殺死,指的都是系統殺死activity所在的進程(process),系統不會殺死單一activity

     系統使用activity棧(activity stack)來管理activity,當一個新的activity啓動時(started),它被放置在棧頂,之前的activity置於它的下面,直到新的activity退出,之前的activity纔會回到前臺。
     總地來說Activity有四種狀態:
     ①、在屏幕前臺(即是在棧頂),爲resumed狀態,不可殺死。
     ②、可見但是失去焦點(即不可與用戶進行交互,比如上面有另外一個非全屏的或者透明的activity),此時activity處於paused狀態,但它還是活的(alive),維持着activity上的成員信息( it maintains all state and member information and remains attached to the window manager),還附着於window manager。在系統極度缺少內存的情況下會被殺死。
     ③、完全被其他activity遮擋,用戶不可見。此時是stopped狀態。但它還維持着成員信息( It still retains all state and member information)。當系統其它地方需要內存時,它會被殺死。
     ④、當activity是paused或者stopped狀態時,系統可以通過要求其finish或直接殺死其所在的進程的方法,來結束一個activity,當這個activity再次回到前臺時,必須完全重啓與恢復到它之前的狀態。
     
     在onCreate()中進行初始化工作或全局狀態(global state)的準備。在onDestroy()中進行資源的釋放。比如需要有個後臺下載的線程,則可以在onCreate()方法中進行創建,然後在onDestroy()中進行停止。
     在onPause()方法中提交需要持久化的數據、停止動畫以及其它需要使用CPU的事情,需要注意的是在onPause()中的實現應該越快越好,因爲onPause()方法不返回,後面(stop/destroy/resume)就無法繼續。要注意的是,手動調用finish()方法,也會依照順序執行onPause()、onDestroy()。
     在onStop()方法中進行heavey-load的操作,例如保存應用數據、用戶數據、存儲數據庫、執行網絡操作等耗時或耗CPU資源的。當一個activity進入stopped狀態後,這個activity對象會被駐留在內存中,它還維持着其中的所有狀態和成員信息(member information),比如edittext中用戶輸入的內容等,即是系統殺死了activity所在的進程,activity中的所有狀態和信息都還保存在bundle中,並且將在用戶回到這個activity時恢復,如果要保存view的狀態,需要給它一個ID
     onDestroy()方法在一個activity被finished時回調,可能是有人調用finish()方法,也可能是系統爲了節省空間暫時地把這個activity的實例給destroy掉。可以通過isFinishing()方法來區別這兩者。tips:在onPause()方法中使用isFinishing()方法,來判斷activity只是單純地暫停還是正在結束。
     


異常情況下的生命週期
   onSaveInstanceState(Bundle)
     onSaveInstanceState(Bundle)調用時機:
          ①、 資源相關的配置信息發生改變導致Activity生命週期異常,比如旋轉屏幕。activity會被銷燬重建,這個方法會被調用。
            ②、 用戶按下home鍵。
            ③、 系統回收內存,殺死activity所在的進程前。
     這個方法在onStop()方法調用之前被調用,用戶按返回鍵或主動調用finish()方法將不會調用這個方法。
     可以在這個方法裏面進行activity的一些動態數據的保存(保存在bundle中)。在之後如果activity被re-created的話,可以在onCreate()方法中取回bundle。需要注意的是,應該在onPause()方法中保存需要持久化的數據,而不應在onSaveInstanceState()方法中,因爲後者不是生命週期方法中的一部分,它並不會在任何情況下都被調用。可以看onSaveInstanceSate(Bundle)的官方文檔:"This method is called before an activity may be killed so that when it comes back some time in the future it can restore its state." 在一個activity可能被殺死時,纔會調用這個方法。希望系統自動保存view的狀態的話,需要給view一個id。

     onRestoreInstanceState()
     只有在系統殺死activity所在進程且用戶又回到這個activity時纔會調用這個方法:
          ①、屏幕方向旋轉。
          ②、系統回收內存。
     這個方法在onStart()和onPostCreate()方法之間被調用。
     要注意的是,onRestoreInstanceState()和onCreate()方法接收的Bundle是同一個。onCreate()方法是每次創建activity都會被調用,所以如果需要使用bundle恢復數據的話,需要判斷bundle是否爲null。爲了簡便,可以不在onCreate()中恢復數據而在onRestoreInstanceState()中恢復,因爲onRestoreInstanceState()只會在bundle不爲null時調用(即非第一次創建)。
 


發佈了36 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章