一.各個生命周期解釋
(1) onCreate:表示Activity正在被創建,生命周期第一個方法,在此方法中做一些初始化工作,比如調用setContentView加載布局資源、初始化Activity所需數據等。
(2) onRestart:表示Activity正在重新啟動,當前Activity從不可見重新變為可見狀態,主要是發生在當用戶打開一個新Activity,此時會執行當前Activity的onPause()和onStop()方法,接著再回到當前這個Activity的時候會執行此方法,或者用戶在當前Activity頁面按下Home鍵,再回到這個Activity也會執行該方法。
(3) onStart:表示Activity正在被啟動,此時Activity已經可見了,但是還沒有出現在前臺我們還看不到,無法與其交互。
(4) onResume:表示Activity在已經可見,顯示在前臺并且可以與其交互,與onStart( )的時候都是可見,但是onStart的時候Activity是在后臺,onResume的時候才在前臺。
(5) onPause:表示Activity正在停止,正常情況下會接著調用onStop()方法,但是如果Activity采用透明主題則不會調onStop()方法,可以做一些存儲數據,停止動畫等工作,但這個方法不能處理太耗時的操作,因為新打開的Activity是在此Activity執行完onPause之后才能執行onResume()。
(6) onStop:表示Activity即將停止,可以做一些稍微重量級的回收工作,但不能太耗時。
(7) onDestory:表示Activity即將被銷毀了,這是Activity生命周期的最后一個回調方法,可以執行最終的回收和資源釋放工作。
二.生命周期回調順序
(1).針對一個特定的Activity,第一次啟動,回調如下:onCreate->onStart->onResume.
(2).當用戶打開新的Activity或者切換到桌面的時候,回調如下:onPause->onStop.
(特殊情況:如果新的Activity采用透明主題,回調僅為onPause)。
(3).當用戶再次回到原Activity時,回調如下:onRestart->onStart->onResume.
(4).當用戶按下back返回鍵時,回調如下:onPause->onStop->onDestory.
(5).當后臺Activity被系統回收后再次打開應用,回調如下:onCreate->onStart->onResume.
(6).從整個生命周期來說,onCreate和onDestory是配對的,標識著Activity的創建與銷毀,在整個生命周期中僅調用一次。onStart和onStop是配對的,標識著Activity的可見,在整個生命周期中可調用多次。onResume和onPause是配對的,標識著Activity是否位于前臺,在整個生命周期中可調用多次。
三.生命周期相關問題
(1).不能再onPause中做重量級的耗時操作,因為必須在onPause執行完成后新的Activity才能onResume顯示出來.
(2).當系統配置發生變化后,Activity會被銷毀,而此Activity是在異常情況下終止的,系統會調用onSaveInstanceState來保存當前Activity狀態,這個方法調用時機是在onStop之前,它和onPause沒有既定的時序關系,有可能在前,也有可能在后。正常情況下系統不會調用onSaveInstanceState,只有在Activity異常終止的情況下才調用。
(3).在onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據。如果選擇在onCreate中來恢復數據,一定要額外的判斷Bundle是否為空.(官方文檔建議使用onRestoreInstanceState來恢復數據)。系統也會默認為我們做一定的恢復工作,如保存當前Activity的視圖結構,文本框中輸入的數據,ListView滾動位置等。
(4).關于保存和恢復View的層次結構,系統工作流程是:Activity異常終止,Activity調用onSaveInstanceState去保存數據,然后Activity會委托Windows去保存數據,接著Window再委托它上面的頂層容器去保存數據。頂層容器是一個ViewGroup,一般來說它很可能是DectorView,最后頂層容器再去通知它的子元素保存數據。(這是一種委托思想,上層委托下層,父容器委托子元素去處理事情,如View的繪制過程,事件分發都是采用類似的思想)
(5).內存不足會導致低優先級的Activity被殺死:
? ? ①.后臺Activity優先級最低,因為已經執行了onStop,被暫停了。
? ? ②.可見單非前臺Activity,比如Activity中彈出一個對話框,導致Activity可見但位于后臺無法與用戶直接交互。
? ? ③.前臺Activity,正在和用戶交互的Activity。
備注:當系統內存不足時,系統會按照上述優先級去殺死目標Activity所在的進程,要在在onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據。如果一個進程中沒有四大組件在執行,很容易被系統殺死。解決方法一般是將后臺工作放入Service中從而保證該進程有一定的優先級,不會輕易被系統殺死。
四.android:configChanges屬性
如果我們沒有給Activity指定configChanges屬性,當配置發生變化后會導致Activity重新創建,常用的配置local,keyboardHidden,orientation,screenSize。
local:設備的本地位置發生了變化,一般指切換了系統語言。
keyboardHidden:鍵盤的可訪問性發生了變化,不如用戶調出了鍵盤。
orientation:屏幕方向發生了變化,這個最常用,比如旋轉了手機屏幕。
screenSize:屏幕的尺寸信息發生了變化,當旋轉手機屏幕時,屏幕尺寸會發生變化。
? ? ①.不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
? ? ②.設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
? ? ③.設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法
但是,自從Android 3.2(API 13),在設置Activity的android:configChanges="orientation|keyboardHidden"后,還是一樣會重新調用各個生命周期的。因為screen size也開始跟著設備的橫豎切換而改變。所以,在AndroidManifest.xml里設置的MiniSdkVersion和 TargetSdkVersion屬性大于等于13的情況下,如果你想阻止程序在運行時重新加載Activity,除了設置"orientation", 你還必須設置"ScreenSize"。
五.Activity生命周期圖
總結:
本文對Android的Activity生命周期進行了整理與介紹,是對Android開發進階要點進行整理,持續整理更多Android的知識與系統工作機制。
部分內容均來源網上 與《Android開發藝術探索》一書。
如有相關問題可聯系作者:weixidream@gmail.com