在平常應用中Activity是與用戶交互的接口,它提供了一個用戶完成相關操做的窗口。當咱們在開發中建立Activity後,經過調用setContentView(View)方法來給該Activity指定一個佈局界面,而這個界面就是提供給用戶交互的接口。Android系統中是經過Activity棧的方式來管理Activity的,而Activity自身則是經過生命週期的方法來管理的本身的建立與銷燬,既然如此,如今咱們就來看看Activity生命週期是如何運做的。android
Activity處於活動狀態,此時Activity處於棧頂,是可見狀態,可與用戶進行交互。佈局
當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化爲Paused狀態。但咱們須要明白,此時Activity只是失去了與用戶交互的能力,其全部的狀態信息及其成員變量都還存在,只有在系統內存緊張的狀況下,纔有可能被系統回收掉。動畫
當一個Activity被另外一個Activity徹底覆蓋時,被覆蓋的Activity就會進入Stopped狀態,此時它再也不可見,可是跟Paused狀態同樣保持着其全部狀態信息及其成員變量。3d
當Activity被系統回收掉時,Activity就處於Killed狀態。 Activity會在以上四種形態中相互切換,至於如何切換,這因用戶的操做不一樣而異。瞭解了Activity的4種形態後,咱們就來聊聊Activity的生命週期。cdn
這裏咱們先來看一張經典的生命週期流程圖: 對象
該方法是在Activity被建立時回調,它是生命週期第一個調用的方法,咱們在建立Activity時通常都須要重寫該方法,而後在該方法中作一些初始化的操做,如經過setContentView設置界面佈局的資源,初始化所須要的組件信息等。blog
此方法被回調時表示Activity正在啓動,此時Activity已處於可見狀態,只是尚未在前臺顯示,所以沒法與用戶進行交互。能夠簡單理解爲Activity已顯示而咱們沒法看見擺了。接口
當此方法回調時,則說明Activity已在前臺可見,可與用戶交互了,onResume方法與onStart的相同點是二者都表示Activity可見,只不過onStart回調時Activity仍是處於後臺沒法與用戶交互,而onResume則已顯示在前臺,可與用戶交互。固然從流程圖,咱們也能夠看出當Activity中止後(onPause方法和onStop方法被調用),從新回到前臺時也會調用onResume方法,所以咱們也能夠在onResume方法中初始化一些資源,好比從新初始化在onPause或者onStop方法中釋放的資源。生命週期
此方法被回調時則表示Activity正在中止(Paused形態),通常狀況下onStop方法會緊接着被回調。但經過流程圖咱們還能夠看到一種狀況是onPause方法執行後直接執行了onResume方法,這屬於比較極端的現象了,這多是用戶操做使當前Activity退居後臺後又迅速地再回到到當前的Activity,此時onResume方法就會被回調。固然,在onPause方法中咱們能夠作一些數據存儲或者動畫中止或者資源回收的操做,可是不能太耗時,由於這可能會影響到新的Activity的顯示——onPause方法執行完成後,新Activity的onResume方法纔會被執行。內存
通常在onPause方法執行完成直接執行,表示Activity即將中止或者徹底被覆蓋(Stopped形態),此時Activity不可見,僅在後臺運行。一樣地,在onStop方法能夠作一些資源釋放的操做(不能太耗時)。
表示Activity正在從新啓動,當Activity由不可見變爲可見狀態時,該方法被回調。這種狀況通常是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接着又回到當前Activity頁面時,onRestart方法就會被回調。
此時Activity正在被銷燬,也是生命週期最後一個執行的方法,通常咱們能夠在此方法中作一些回收工做和最終的資源釋放。
異常的生命週期是指Activity被系統回收或者當前設備的Configuration發生變化(通常指橫豎屏切換)從而致使Activity被銷燬重建。異常的生命週期主要分如下兩種狀況:
實際上這兩個方法是系統自動調用的,當系統配置發生變化後,Activity會被銷燬,也就是onPause,onStop,onDestroy會被依次調用,同時由於Activity是在異常狀況下銷燬的,android系統會自動調用onSaveInstanceState方法來保存當前Activity的狀態信息,所以咱們能夠在onSaveInstanceState方法中存儲一些數據以便Activity重建以後能夠恢復這些數據,固然這個方法的調用時機必須在onStop方法以前,也就是Activity中止以前。至跟onPause方法的調用時機能夠隨意。
當Activity被從新建立以後,系統還會去調用onRestoreInstanceState方法,並把Activity銷燬時經過onSaveInstanceState方法保存的Bundle對象做爲參數同時傳遞給onRestoreInstanceState和onCreate方法,所以咱們能夠經過onRestoreInstanceState和onCreate方法來判斷Activity是否被從新建立,假若被重建了,咱們就能夠對以前的數據進行恢復。onRestoreInstanceState方法的調用時機是在onStart以後的。
這裏有點須要特別注意,onSaveInstanceState和onRestoreInstanceState只有在Activity異常終止時纔會被調用的,正常狀況是不會調用這兩個方法的。
其實二者均可以,二者的區別在於,onRestoreInstanceState方法一旦被系統回調,其參數Bundle必定不爲空,無需額外的判斷,而onCreate的Bundle卻不必定有值,由於若是Activity是正常啓動的話,Bundle參數是不會有值的,所以咱們須要額外的判斷條件,固然雖然說二者均可以數據恢復,但更傾向於onRestoreInstanceState方法。