?????Activity是Android組件中最基本也是最為常見用的四大組件之一,也是我們在開發(fā)過程之中接觸最多的組件,所以了解Activity的生命周期,并正確的理解與應(yīng)用剿牺,是必不可少的。下面就來介紹一下Activity生命周期环壤。
生命周期
?????活動在系統(tǒng)中被活動堆棧管理晒来。當(dāng)一個新的活動開始時,將會強加于堆棧的頂端并成為運行活動狀態(tài)郑现。而之前的活動總是被放置在這個活動下面的堆棧中湃崩,并且不會被移動到前臺直到新的活動退出為止荧降。
?????活動從開始到結(jié)束經(jīng)歷各種狀態(tài)。從一個狀態(tài)到另一個狀態(tài)的轉(zhuǎn)變攒读,從無到有再到無朵诫,這樣一個過程中所經(jīng)歷的各個狀態(tài)就叫做生命周期。Activity擁有自己的生命周期薄扁,而它的意義就在于剪返,當(dāng)我們對當(dāng)前的界面進(jìn)行展示的過程中,本身也會經(jīng)歷各個階段去準(zhǔn)備和處理當(dāng)前的activity邓梅,然后展示給用戶脱盲,而開發(fā)者為了界面上一些炫酷的效果與功能,做一些特殊處理時日缨,就離不開這些生命周期钱反。
各生命周期狀態(tài)說明
方法 | 描述 | 用途(以當(dāng)前界面播放視頻為例) | 下一個方法 |
---|---|---|---|
onCreate() | 當(dāng)Activity第一次創(chuàng)建時調(diào)用。該方法(如果有)會提供給你一個包含之前活動的凍結(jié)狀態(tài)信息bundle包匣距。 | 進(jìn)行一系列初始化操作面哥,如:創(chuàng)建View,加載視頻數(shù)據(jù)等墨礁。 | onStart() |
onRestart() | 當(dāng)Activity被停止后調(diào)用幢竹,在重新開始之前 | 當(dāng)活動停止后重新啟動該活動時調(diào)用(不常用)耳峦,針對停止后重啟操作恩静。 | onStart() |
onStart() | 當(dāng)Activity被展示在用戶眼前時調(diào)用。如果活動出現(xiàn)在前臺緊接著是onResume()蹲坷,如果活動直接隱藏則緊接著是onStop()驶乾。 | 該方法也不常用。 | onResume() or onStop() |
onResume() | 當(dāng)Activity將開始與用戶進(jìn)行交互時調(diào)用循签。在這個時間點你的活動將會在活動堆棧的頂端级乐,用戶輸入將會訪問它。 | 暫停后恢復(fù)我們會在該方法中進(jìn)行一些操作县匠,例如視頻繼續(xù)播放风科。 | onPause() |
onPause() | 當(dāng)系統(tǒng)將要恢復(fù)一個之前的活動。這是一個有代表性的常常用于提交未被存儲的改動信息為持久數(shù)據(jù)乞旦,停止動畫和消耗CPU的東西等贼穆。實現(xiàn)該方法必須要特別的迅速,因為在此方法返回之前兰粉,下一個活動將不會恢復(fù)故痊。如果活動將返回到前臺則接下來調(diào)用onResume(),如果要隱藏到用戶看不見的地方時玖姑,則調(diào)用onStop(); | 該方法十分重要愕秫,用來做信息持久化存儲操作以及停止消耗CPU資源操作慨菱,如記錄視頻播放進(jìn)度時間,以及暫停視頻播放操作等戴甩。 | onResume or onStop() |
onStop() | 當(dāng)另一個活動被恢復(fù)且完全覆蓋該活動符喝,而該Activity將不在展示給用戶時調(diào)用。這種情況將發(fā)生在一個新的活動將被開始甜孤,一個退出的活動將被恢復(fù)洲劣,又或者該活動將要被銷毀。如果該活動將恢復(fù)與用戶交互則調(diào)用onRestart(),如果該活動將被銷毀則調(diào)用onDestory()课蔬。 | 界面將會隱藏或銷毀囱稽,做一些重要信息或未被存儲的信息的存儲操作。但也不要太耗時二跋。如存儲用戶信息等操作战惊,以及用戶此次觀看的視頻地址以及時間,便于下次打開該界面時繼續(xù)播放扎即。 | onRestart() or onResume() |
onDestory() | Activity被銷毀錢最后一個被調(diào)用的方法吞获。這個方法將會發(fā)生因為活動將會結(jié)束(在活動中調(diào)用finish()方法,或者系統(tǒng)臨時銷毀該實例節(jié)約空間谚鄙。你可以使用isFinishing()方法區(qū)別這兩種場景)各拷。 | 界面將要銷毀,釋放一些實例節(jié)約空間闷营,如置空List集合等烤黍。 |
?????下圖中展示了activity的重要的狀態(tài)改變路徑。矩形中的代表你可以在活動在兩種狀態(tài)間改變時你可以實現(xiàn)的回調(diào)方法去執(zhí)行想要的操作傻盟。而帶有顏色的橢圓形代表著activity的主要狀態(tài)速蕊。
方法 | 描述 | 用途(以當(dāng)前界面播放視頻為例) | 下一個方法 |
---|---|---|---|
onCreate() | 當(dāng)Activity第一次創(chuàng)建時調(diào)用。該方法(如果有)會提供給你一個包含之前活動的凍結(jié)狀態(tài)信息bundle包娘赴。 | 進(jìn)行一系列初始化操作规哲,如:創(chuàng)建View,加載視頻數(shù)據(jù)等诽表。 | onStart() |
onRestart() | 當(dāng)Activity被停止后調(diào)用唉锌,在重新開始之前 | 當(dāng)活動停止后重新啟動該活動時調(diào)用(不常用),針對停止后重啟操作竿奏。 | onStart() |
onStart() | 當(dāng)Activity被展示在用戶眼前時調(diào)用袄简。如果活動出現(xiàn)在前臺緊接著是onResume(),如果活動直接隱藏則緊接著是onStop()议双。 | 該方法也不常用痘番。 | onResume() or onStop() |
onResume() | 當(dāng)Activity將開始與用戶進(jìn)行交互時調(diào)用。在這個時間點你的活動將會在活動堆棧的頂端,用戶輸入將會訪問它汞舱。 | 暫停后恢復(fù)我們會在該方法中進(jìn)行一些操作伍纫,例如視頻繼續(xù)播放。 | onPause() |
onPause() | 當(dāng)系統(tǒng)將要恢復(fù)一個之前的活動昂芜。這是一個有代表性的常常用于提交未被存儲的改動信息為持久數(shù)據(jù)莹规,停止動畫和消耗CPU的東西等。實現(xiàn)該方法必須要特別的迅速泌神,因為在此方法返回之前良漱,下一個活動將不會恢復(fù)。如果活動將返回到前臺則接下來調(diào)用onResume()欢际,如果要隱藏到用戶看不見的地方時母市,則調(diào)用onStop(); | 該方法十分重要,用來做信息持久化存儲操作以及停止消耗CPU資源操作损趋,如記錄視頻播放進(jìn)度時間患久,以及暫停視頻播放操作等。 | onResume or onStop() |
onStop() | 當(dāng)另一個活動被恢復(fù)且完全覆蓋該活動浑槽,而該Activity將不在展示給用戶時調(diào)用蒋失。這種情況將發(fā)生在一個新的活動將被開始,一個退出的活動將被恢復(fù)桐玻,又或者該活動將要被銷毀篙挽。如果該活動將恢復(fù)與用戶交互則調(diào)用onRestart(),如果該活動將被銷毀則調(diào)用onDestory()。 | 界面將會隱藏或銷毀镊靴,做一些重要信息或未被存儲的信息的存儲操作铣卡。但也不要太耗時。如存儲用戶信息等操作邑闲,以及用戶此次觀看的視頻地址以及時間算行,便于下次打開該界面時繼續(xù)播放。 | onRestart() or onResume() |
onDestory() | Activity被銷毀錢最后一個被調(diào)用的方法苫耸。這個方法將會發(fā)生因為活動將會結(jié)束(在活動中調(diào)用finish()方法,或者系統(tǒng)臨時銷毀該實例節(jié)約空間儡陨。你可以使用isFinishing()方法區(qū)別這兩種場景)褪子。 | 界面將要銷毀,釋放一些實例節(jié)約空間骗村,如置空List集合等嫌褪。 |
階段狀態(tài)
?????一個Activity從本質(zhì)上講擁有4種狀態(tài):
- 運行:如果當(dāng)前的activity在前臺界面上時(堆棧頂端)。
- 暫停:如果activity被另一個非全屏活動強占焦點并覆蓋時(如彈窗dialog)胚股,它將會暫停笼痛。一個暫停的活動也是完全活躍的(它的所有的狀態(tài)和成員信息將會保留,但activity本身將不會再依附于WindowsManager了),在內(nèi)存極度缺乏的狀態(tài)會被系統(tǒng)殺死缨伊。
- 停止:如果activity完全被另一個全屏活動遮擋住時摘刑,它將會停止。該活動也仍保留全部的狀態(tài)和成員信息刻坊,但將會被隱藏起來不再展示給用戶枷恕,并且當(dāng)內(nèi)存在其他地方被需要時該活動就將會被系統(tǒng)殺死。
- 重啟:如果activity處于暫吞放撸或者停止?fàn)顟B(tài)徐块,系統(tǒng)將會在內(nèi)存中終止該活動無論是結(jié)束活動或者殺死進(jìn)程。當(dāng)它再一次展示給用戶時灾而,它必須是完全重啟并且恢復(fù)到之前的狀態(tài)胡控。
狀態(tài)轉(zhuǎn)換
?????上圖中我們可以看到Activity在生命周期狀態(tài)進(jìn)行轉(zhuǎn)換的過程中,activity本身是在什么時候調(diào)用的onSaveInstanceState()方法與onRestoreInstanceState()方法來進(jìn)行重要信息的存儲與恢復(fù)的旁趟。因為在蜂巢版本之前onSaveInstanceState()方法只有在activity異常退出時才會調(diào)用铜犬,所以我們應(yīng)該在onPause()方法中進(jìn)行信息持久化存儲的操作,在蜂巢之后的版本轻庆,生命周期就可以正常的調(diào)用onSaveInstanceState()方法來進(jìn)行信息持久化存儲的操作了癣猾。
部分實例列舉
?????上面說了一堆Activity生命周期的定義,在實際應(yīng)用中余爆,我們更傾向于實踐運用纷宇,所以我會列舉部分實例。Github傳送門,大家可以給我點個小星星蛾方。
- 打開activity關(guān)閉activity生命周期如下(啟動與銷毀)
// activity啟動
05-24 11:16:44.124 16259-16259/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onCreate
05-24 11:16:44.125 16259-16259/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onStart
05-24 11:16:44.125 16259-16259/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onResume
// activity關(guān)閉
05-24 11:16:46.691 16259-16259/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onPause
05-24 11:16:47.038 16259-16259/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onStop
05-24 11:16:47.038 16259-16259/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onDestroy
?????可以看到正常的啟動與關(guān)閉Activity不會調(diào)用onSaveInstanceState(Bundle)方法與onRestoreInstanceState(Bundle)方法像捶,所以如果要離開該界面時,該界面的重要信息桩砰,我們要在onPause()或onStop()方法中進(jìn)行存儲拓春。
- 彈窗(dialog、popupwindow)
[空]
?????沒錯亚隅,你沒看錯硼莽。是空!因為dialog與popupwindow實際上是一個存在于這個activity上的控件煮纵,所以它并不會影響activity本身的生命周期懂鸵!試想如果你每次彈窗你的activity都要走onPause方法的話,那你的一些存儲持久化操作是不是會不停地?zé)o更新的存儲呢行疏?所以匆光,不要被一些說法誤導(dǎo),如果你不知道酿联,那么就去動手實踐终息。
- 打開Dialog樣式的Activity(暫停狀態(tài))
// 在Manifest文件中首先設(shè)置dialog樣式
<activity android:name=".TranslateActivity"
android:theme="@style/Theme.AppCompat.Dialog">
</activity>
// 然后你懂得夺巩,我們來打開這個dialog樣式的Activity
05-24 16:27:24.964 26913-26913/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onPause
05-24 16:27:25.206 26913-26913/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onSaveInstanceState
// 最后我們關(guān)閉這個Activity
05-24 16:27:28.227 26913-26913/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onResume
- 屏幕旋轉(zhuǎn)
05-24 11:24:47.377 16724-16724/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onPause
05-24 11:24:47.378 16724-16724/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onSaveInstanceState
05-24 11:24:47.378 16724-16724/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onStop
05-24 11:24:47.378 16724-16724/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onDestroy
05-24 11:24:47.451 16724-16724/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onCreate
05-24 11:24:47.454 16724-16724/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onStart
05-24 11:24:47.454 16724-16724/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onRestoreInstanceState
05-24 11:24:47.454 16724-16724/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onResume
?????此處的onSaveInstanceState(Bundle)方法與onRestoreInstanceState(Bundle)方法具體執(zhí)行時機(jī),當(dāng)targetSdkVersion小于3時onSaveInstanceState是在onPause方法中調(diào)用的周崭,而大于3時是在onStop方法中調(diào)用的柳譬。而onRestoreInstanceState是在onStart之后、onResume之前調(diào)用的休傍。
- 按Home鍵后再開啟app(停止?fàn)顟B(tài))
// 點擊home鍵(菜單鍵)
05-24 11:50:25.097 17817-17817/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onPause
05-24 11:50:25.407 17817-17817/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onSaveInstanceState
05-24 11:50:25.407 17817-17817/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onStop
// 打開App
05-24 11:51:05.471 17817-17817/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onRestart
05-24 11:51:05.476 17817-17817/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onStart
05-24 11:51:05.476 17817-17817/com.perry.activitylifecycle E/TAG lifecycle: ------>>> onResume
小結(jié)
?????文章中我們具體的了解了Activity的7大生命周期與4種本質(zhì)狀態(tài)征绎,還有onSaveInstanceState(Bundle)方法與onRestoreInstanceState(Bundle)具體執(zhí)行時機(jī)。便于我們更好的了解與利用Activity中的每一種生命周期方法磨取。