轉:http://blog.csdn.net/qq_23547831/article/details/41693807
Activity生命周期
在系統中的Activity被一個Activity棧所管理。當一個新的Activity啟動時,將被放置到棧頂,成為運行中的Activity,前一個Activity保留在棧中,不再放到前臺,直到新的Activity退出為止。
一、Activity有四種本質區別的狀態:
1.在屏幕的前臺(Activity棧頂),叫做活動狀態或者運行狀態(active or running);
2.如果一個Activity失去焦點,但是依然可見(一個新的非全屏的Activity或者一個透明的Activity被放置在棧頂),叫做暫停狀態(Paused)。一個暫停狀態的Activity依然保持活力(保持所有的狀態,成員信息,和窗口管理器保持連接),但是在系統內存極端低下的時候將被殺掉。
3.如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的窗口被隱藏,當系統內存需要被用在其他地方的時候,Stopped的Activity將被殺掉。
4.如果一個Activity是Paused或者Stopped狀態,系統可以將該Activity從內存中刪除,Android系統采用兩種方式進行刪除,要么要求該Activity結束,要么直接殺掉它的進程。當該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態。
二、
在上圖中,Activity有三個關鍵的循環:
1.整個的生命周期,從onCreate(Bundle)開始到onDestroy()結束。Activity在onCreate()設置所有的“全局”狀態,在onDestory()釋放所有的資源。例如:某個Activity有一個在后臺運行的線程,用于從網絡下載數據,則該Activity可以在onCreate()中創建線程,在onDestory()中停止線程。
2.可見的生命周期,從onStart()開始到onStop()結束。在這段時間,可以看到Activity在屏幕上,盡管有可能不在前臺,不能和用戶交互。在這兩個接口之間,需要保持顯示給用戶的UI數據和資源等,例如:可以在onStart中注冊一個IntentReceiver來監聽數據變化導致UI的變動,當不再需要顯示時候,可以在onStop()中注銷它。onStart(),onStop()都可以被多次調用,因為Activity隨時可以在可見和隱藏之間轉換。
3.前臺的生命周期,從onResume()開始到onPause()結束。在這段時間里,該Activity處于所有Activity的最前面,和用戶進行交互。Activity可以經常性地在resumed和paused狀態之間切換,例如:當設備準備休眠時,當一個Activity處理結果被分發時,當一個新的Intent被分發時。所以在這些接口方法中的代碼應該屬于非常輕量級的。
可以從三個階段關注Activity的生命周期:
?整個的生命周期,指的是onCreate(Bundle)和onDestroy()之間過程。Activity在onCreate()設置所有的“全局”狀態,在onDestroy()釋放所有的資源。
?可見的生命周期,指的是onStart()和onStop()之間的過程。在這段時間,可以看到Activity在屏幕上,盡管有可能不在前臺,不能和用戶交互。在這兩個接口之間,需要保持顯示給用戶的UI數據和資源等。onStart(),onStop()都可以被多次調用,因為Activity隨時可以在可見和隱藏之間轉換。
?前臺的生命周期,指的是onResume()和onPause()之間的過程。在這段時間里,該Activity處于所有 Activity的最上面,獲得了用戶焦點。Activity可以經常性地在RESUMED和PAUSED狀態之間切換,所以在這些接口方法中的代碼應該屬于非常輕量級的,避免低效的轉換而讓用戶有等待的感覺。
三、由此,我們可以得出下面幾個典型的場景:
1) Activity從被裝載到運行。則執行順序為:onCreate()->onStart()->onResume();
這是個典型過程,發生在Activity被系統裝載運行時。
2) Activity從運行到暫停,再到繼續回到運行。執行順序為:onPause()->onResume();
這個過程發生在Activity被別的Activity遮住了部分UI,失去了用戶焦點,另外那個Activity退出之后,這個Activity再次重新獲得運行。這個過程中該Activity的實例是一直存在。
3) Activity從運行到停止。執行順序為:onPause()->onStop();
這個過程發生在Activity的UI完全被別的Activity遮住了,當然也失去了用戶焦點。這個過程中Activity的實例仍然存在。比如,當Activity正在運行時,按HOME鍵,該Activity就會被執行這個過程。
4) Activity從停止到運行。執行順序為:onRestart()->onStart()->onResume();
處于STOPPED狀態并且實例仍然存在的Activity,再次被系統運行時,執行這個過程。這個過程是3的逆過程,只是要先執行onRestart()而重新獲得執行。
5) Activity從運行到銷毀。執行順序為:onPause()->onStop()->onDestroy();
這個過程發生在Activity完全停掉并被銷毀了,所以該Activity的實例也就不存在了。比如,當Activity正在運行時,按BACK鍵,該Activity就會被執行這個過程。這個過程可看作是1的逆過程。
6) 被清除出內存的Activity重新運行。執行順序為:onCreate()->onStart()->onResume();
這個過程對用戶是透明的,用戶并不會知道這個過程的發生,看起來如同1的執行順序,不同的是如果保存有系統被清除出內出時的信息,會在調用onCreate()時,系統以參數的形式給出,而1中onCreate()的參數為null。
四、下面闡述幾種比較常見的情況:
(1) 單個A Activity啟動回調流程
onCreate
onStart
onResume
(2) 當用戶按下home鍵時
onPause
onStop
(3) 當用戶再次回到原Activity時
onRestart
onStart
onResume
(4) 在A Activity的基礎上,打開新的B Activity,此時需要注意的問題是B Activity的大小和透明度
a. B Activity完全覆蓋A Activity,并且B Activity是不透明的:
A Activity: onPause
B Activity: onCreate --> on Start --> onResume
A Activity : onStop
b. B Activity因為尺寸小沒有完全覆蓋A Activity,或者B Activity是透明的, 此時A Activity的onStop方法是不會被執行的
A Activity: onPause
B Activity: onCreate --> on Start --> onResume
(5) 當用戶按back鍵時
onPause
onStop
onDestory