在Activity生命周期中,系統(tǒng)調用App生命周期中設置的回調方法,這些生命周期回調方法在第一層就像一個金字塔?;顒由芷诘拿總€階段都對應于金字塔的一個步驟。
成都地區(qū)優(yōu)秀IDC服務器托管提供商(成都創(chuàng)新互聯(lián)).為客戶提供專業(yè)的達州服務器托管,四川各地服務器托管,達州服務器托管、多線服務器托管.托管咨詢專線:18982081108
當系統(tǒng)創(chuàng)建一個新的Activity實例時,回調方法從塔的底部一級一級地移動到塔的頂部。當它位于金字塔的頂部時,活動位于用戶的前臺,此時用戶可以與活動進行交互。當用戶想要離開活動時,系統(tǒng)調用另一系列方法將活動的狀態(tài)從頂部移到底部。在某些情況下,Activity只完成部分狀態(tài)遷移并等待用戶的指令,然后返回到塔頂。
根據(jù)活動的復雜性,您可能不必實現(xiàn)所有的生命周期方法。但是,理解每個生命周期回調函數(shù)的含義非常重要,以確保您的應用程序按照用戶的期望正確運行。
要正確實現(xiàn)生命周期的回調方法,從而使應用程序正確動作,需要注意以下幾點:
確保用戶使用你時,應用程序可以接聽電話或切換到其他應用程序,而不會崩潰。確保您的應用程序在用戶不使用時不會消耗系統(tǒng)資源。
確保用戶在從其他應用程序切換回您的應用程序時可以繼續(xù)他們以前的工作,并且在切換用戶屏幕或其他操作時不會崩潰或丟失用戶數(shù)據(jù)。
Android中Activity的生命周期可以分為四類:
foreground process(前景模式)
visible process(可見模式)
background process(背景模式)
empty process(空白模式)
參考官方給出的生命周期圖可以知道Activity的生命周期分為7個方法
onCreate()、onStart() 、onResume()、 onPause()、onStop()、onDestory() 、onRestart()
其中前景模式是由onCreate(創(chuàng)建)、onStart(啟動) 、onResume(可見可交互)三個方法來體現(xiàn)的。而可見模式則分為兩種狀態(tài),一種是被Dialog覆蓋,進入透明模式,在onPause(暫停)可以體現(xiàn)出來,第二就是如果當前Activity被完全覆蓋,就會進入onStop狀態(tài),完全不可見,當覆蓋物消失時會調用onRestart方法來喚醒該Activity,由覆蓋狀態(tài)重新變?yōu)榭梢姞顟B(tài),并重新執(zhí)行onstart()和onResume()重新變?yōu)榭梢娍山换顟B(tài)。
如果Activity被完全覆蓋的話,也就是所謂的第三種狀態(tài),背景模式。此時的Activity有兩種處理方案可以使用,第一方案是調用onDestory()方法完全銷毀當前的Activity。第二方案就是清除掉當前的Activity,并重新執(zhí)行onstart()和onResume()重新變?yōu)榭梢娍山换顟B(tài)。
如果Activity被完全覆蓋,并且系統(tǒng)需要內(nèi)存時,就會暫時銷毀Activity,進入空白模式,空白模式最重要的目的就是暫時釋放出內(nèi)存,直到使用者再度喚醒空白模式的 Activity時,才會將空白模式變成前景模式。
最后附張官方給出的生命周期圖來幫助理解:
單個Actiivty正常的生命周期
onCreate - onStart - onResume - onPause - onStop - onDestory
這就是一個Activity從被創(chuàng)建到被銷毀過程。
其中正常運行狀態(tài)為onResume
當Activity從前臺被置于后臺,
onResume - onPause - onStop
當從后臺重新置于前臺
onStop - onPause - onResatrt - onStart- onResume
其中可以發(fā)現(xiàn),只要Activity置于前臺都會執(zhí)行onStart函數(shù),所以我們可以考慮在這里做一下需要在前臺就處理的邏輯
各個生命周期函數(shù):
onCreate: Activity被創(chuàng)建,此時Activity處于不可見、不可交互
onStart: 此時Activity 部分可見不可交互
onRestart: Activity從后臺重新回到前臺,部分可見不可交互
onResume: 完全可見可交互,為Activity正常運行狀態(tài)
onPause: Activity處于暫停,從前臺被置于后臺 部分可見部分不可見,不可交互
onStop: 完全置于后臺,完全不可見,
onDestroy: Activity被銷毀
上面就是一個正常的Activity的生命周期,
在Activity生命周期中,還設計一些其他:
Activity旋轉:
onCreate - onStart - onResume
此時被旋轉
- onPause - onSaveInstanceState - onStop - onDestroy - onCreate - onStart - onRestoreInstanceState - onResume
可以發(fā)現(xiàn)當Activity被旋轉時,整個Activity是被銷毀然后重新創(chuàng)建的。其中新增調用了兩個生命周期函數(shù)
onSaveInstanceState: 當Activity被系統(tǒng)異常銷毀時被調用,用于存儲數(shù)據(jù),用于系統(tǒng)恢復Activity時恢復數(shù)據(jù)
onRestoreInstanceState: 當Actiivty被系統(tǒng)異常銷毀并重新創(chuàng)建時,取出在onSaveInstanceState時存儲的數(shù)據(jù)
注意,在onCreate函數(shù)中,其實也是有參數(shù)的
此處的savedInstanceState也是在onSaveInstanceState時存儲的數(shù)據(jù),但此處可能為nll,
因為在正常的Activity時,此處就是null,只有在Activity被異常銷毀然后被系統(tǒng)重新創(chuàng)建時,此處才有值。
如果要在此處使用,切記要判空。
onNewIntent與Activity的啟動模式有關
當Activity未設置啟動模式時,則不會觸發(fā)該生命周期函數(shù)
當Activity已經(jīng)處于應用的Activity棧中
onNewIntent只會在Activity設置了啟動模式,并且Activity被復用時才會調起。
注意:只對startActivityForResult調起的Activity起作用,statActivity本質調用的也是startActivityForResult,Activity正常的切換前后臺時不會觸發(fā)的。
A - B:
A正常運行處于 onResume,打開B
A onPause - B onCreate - B onStart - B onResume - A onStop
點擊跳入B頁面, 首先A進入暫停,B開始創(chuàng)建,到onResume完全可見可交互,于是A被完全遮擋,變成完全不可見、處于后臺,進入onStop
A - B -goBack- A
在B頁再執(zhí)行返回
B onPause - A onRestart - A onStart - A onResume - B Stop - B onDestory
和A進入B類似,B返回A時,B進入暫停,A變得重新可見到A完全可見,進入onResume,然后B進入停止,并銷毀
B啟動模式設置為 SingleTop,B - B
B onPause - B onNewIntent - B onResume
因為 B已經(jīng)處于棧頂,啟動模式為 SingleTop 則不會重新創(chuàng)建B的實例
將A的啟動模式設置為SingleTask
可以通過在andorid studio的終端 Terminal中輸入:adb shell dumpsys activity
查看當前應用的Activity task棧
下圖是官方文檔里的Activity生命周期圖,其中彩色標出的四個框是Activity的四種狀態(tài),當Activity的狀態(tài)改變時會觸發(fā)一個或多個onXXX()方法。
onCreate()
當Acitivity第一次被創(chuàng)建時觸發(fā),一般在這里要做的事情包括創(chuàng)建視圖(setContentView())、向視圖填充必要的數(shù)據(jù)等等。
onRestart()
這個我比較少用到,按文檔上的介紹,如果Activity之前被stop過,那么下一次onStart()方法之前會先觸發(fā)這個方法。
onStart()
只要Activity從不可見變成可見,就會觸發(fā)到這個方法,但被AlertDialog遮擋/顯示的情況不算在內(nèi)。
onResume()
當Activity來到最上層的時候,也就是開始與用戶直接交互時,觸發(fā)這個方法。例如本來Activity被一個AlertDialog遮擋,當這個AlertDialog消失時,onResume()方法就被觸發(fā)。
onPause()
和onResume()的觸發(fā)條件剛好相反,如果Activity本來在最上層,當它要讓出最上層的位置時會觸發(fā)這個方法。onPause()和onResume()是被觸發(fā)最頻繁的兩個方法,所以在這里不應該執(zhí)行過于消耗資源的方法。
onStop()
當有其他Activity覆蓋了當前Activity時,不論另一個Activity是新開始的還是從下層移至最上層的,當前Activity的onStop()方法都會被觸發(fā)。
onDestroy()
Activity生命周期的終點。有兩種情況會導致它被觸發(fā):1)執(zhí)行了Activity#finish()方法;2)Android系統(tǒng)由于資源不足等原因決定殺掉Activity所在進程。通過isFinishing()方法可以判斷出是哪種情況。在這個方法里,我們一般要做的事情是釋放Activity占有的資源,例如后臺正在進行的下載線程等等。
最后,舉個實際例子來說明,假設你有一個“首頁Activity”和一個“編輯頁Activity”。
?當用戶點擊首頁里的“開始編輯”按鈕時,首頁的onPause()-onStart()onStop()依次觸發(fā),編輯頁的onCreate()-onStart()-onResume()依次觸發(fā);(感謝James.H.Fu指出的錯誤)
?當用戶在編輯頁按下“返回”按鈕時,編輯頁的onPause()-onStop()依次觸發(fā),之后首頁的onStart() - onResume()依次觸發(fā);
?這時用戶在首頁按下“返回”按鈕,首頁的onPause()-onStop()-onDestroy()依次觸發(fā)。