Activity生命周期

?????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)速蕊。


Activity生命周期.png
方法 描述 用途(以當(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)

Activity4種主要狀態(tài).png

?????一個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)轉(zhuǎn)換.png

?????上圖中我們可以看到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中的每一種生命周期方法磨取。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末人柿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忙厌,更是在濱河造成了極大的恐慌凫岖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逢净,死亡現(xiàn)場離奇詭異哥放,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)爹土,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門甥雕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胀茵,你說我怎么就攤上這事社露。” “怎么了琼娘?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵峭弟,是天一觀的道長。 經(jīng)常有香客問我脱拼,道長瞒瘸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任熄浓,我火速辦了婚禮情臭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玉组。我一直安慰自己谎柄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布惯雳。 她就那樣靜靜地躺著,像睡著了一般鸿摇。 火紅的嫁衣襯著肌膚如雪石景。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音潮孽,去河邊找鬼揪荣。 笑死,一個胖子當(dāng)著我的面吹牛往史,可吹牛的內(nèi)容都是我干的仗颈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼椎例,長吁一口氣:“原來是場噩夢啊……” “哼挨决!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起订歪,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤脖祈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刷晋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盖高,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年眼虱,在試婚紗的時候發(fā)現(xiàn)自己被綠了喻奥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡捏悬,死狀恐怖撞蚕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邮破,我是刑警寧澤诈豌,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站抒和,受9級特大地震影響矫渔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摧莽,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一庙洼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镊辕,春花似錦油够、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卖哎,卻和暖如春鬼悠,著一層夾襖步出監(jiān)牢的瞬間删性,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工焕窝, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蹬挺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓它掂,卻偏偏與公主長得像巴帮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虐秋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容