重新回顧關(guān)于Activity及其啟動(dòng)方式

? ? ? ?首先簡(jiǎn)單說(shuō)一下什么是Activity漱办?Activity是Android四大組件之一花盐,我們主要通過(guò)Activity來(lái)顯示我們的UI狗超,方便用戶操作瞳腌。一個(gè)app中會(huì)有多個(gè)activity,當(dāng)啟動(dòng)新的activity時(shí),當(dāng)前activity會(huì)停止囱嫩,新的activity會(huì)進(jìn)入棧中嗅辣,獲取用戶焦點(diǎn)。當(dāng)用戶按“返回”按鈕時(shí)挠说,當(dāng)前activity銷毀澡谭,前一個(gè)activity重新恢復(fù)。

Activity生命周期圖

Activity 的生命周期:

activity的四種狀態(tài):

(1)運(yùn)行狀態(tài):當(dāng)一個(gè)活動(dòng)位于返回棧的棧頂時(shí)损俭,用戶可以獲取焦點(diǎn)做出操作蛙奖,系統(tǒng)一般不會(huì)回收這個(gè)狀態(tài)。

(2)暫停狀態(tài):彈出一個(gè)活動(dòng)或者一個(gè)非全屏的activity時(shí)杆兵,就會(huì)讓前一個(gè)activity處于pause狀態(tài)雁仲。這時(shí)activity就不會(huì)處于棧頂,但是仍然可見琐脏,只不過(guò)用戶無(wú)法操作攒砖。系統(tǒng)也一般不會(huì)回收這樣的活動(dòng),除非內(nèi)存占用過(guò)大日裙。

(3)停止?fàn)顟B(tài):當(dāng)一個(gè)活動(dòng)不處于棧頂位置吹艇,且完全不可見的時(shí)候,就進(jìn)入停止?fàn)顟B(tài)昂拂,當(dāng)內(nèi)存較低時(shí)系統(tǒng)會(huì)回收這樣的活動(dòng)

(4)銷毀狀態(tài):當(dāng)一個(gè)活動(dòng)從棧中移除后就編程銷毀狀態(tài)受神,系統(tǒng)會(huì)回收這樣的活動(dòng),狀態(tài)信息和成員變量都已經(jīng)不存在了

大致流程可以分為:

.Activity啟動(dòng) -->? onCreate() --> onStart() --> onResume()

2.點(diǎn)擊Home鍵回到系統(tǒng)主界面的時(shí)候 --> onPause() --> onStop()

3.當(dāng)我們?cè)俅位氐皆瓉?lái)的那個(gè)Activity的時(shí)候 --> onRestart() --> onStart() --> onResume()

4.退出當(dāng)前的Activity的時(shí)候 --> onPause() --> onStop() --> onDestory()

5.A Activity 調(diào)用彈出B Activity的時(shí)候(完全覆蓋) --> A onPause() --> B onCreate() --> B onStart() --> B onResume --> A onStop()

6.Activity異常退出的時(shí)候 --> onPause() --> onSaveInstanceState() --> onStop() --> onDestory(),

需要注意的是onSaveInstanceState() 方法與onPause并沒(méi)有嚴(yán)格的先后關(guān)系格侯,有可能在onPause之前鼻听,也有可能在其后面調(diào)用,但會(huì)在onStop()方法之前調(diào)用

7.異常退出后又重新啟動(dòng)該Activity --> onCreate() --> onStart() --> onRestoreInstanceState() --> onResume()

2)啟動(dòng)模式

為什么要有啟動(dòng)模式联四?

我們?cè)陂_發(fā)項(xiàng)目的過(guò)程中撑碴,一般都需要在本應(yīng)用中多個(gè)Activity組件之間的跳轉(zhuǎn),也可能需要在本應(yīng)用中打開其它應(yīng)用的可復(fù)用的Activity朝墩。如我們可能需要跳轉(zhuǎn)到原來(lái)某個(gè)Activity實(shí)例醉拓,此時(shí)我們更希望這個(gè)Activity可以被重用而不是創(chuàng)建一個(gè)新的 Activity,但根據(jù)Android系統(tǒng)的默認(rèn)行為鱼辙,確實(shí)每次都會(huì)為我們創(chuàng)建一個(gè)新的Activity并添加到Task中廉嚼,這樣android系統(tǒng)是不是很傻玫镐?還有一點(diǎn)就是在我們每開啟一次頁(yè)面加入到任務(wù)棧Task中后倒戏,一個(gè)Activity的數(shù)據(jù)和信息狀態(tài)都將會(huì)被保留,這樣會(huì)造成數(shù)據(jù)冗余, 重復(fù)數(shù)據(jù)太多, 最終還可能導(dǎo)致內(nèi)存溢出的問(wèn)題(OOM)恐似。為了解決這些問(wèn)題杜跷,android系統(tǒng)提供了一套Activity的啟動(dòng)模式來(lái)修改系統(tǒng)Activity的默認(rèn)啟動(dòng)行為。

a)standard,標(biāo)準(zhǔn)模式,也是系統(tǒng)的默認(rèn)模式(可以不指定)葛闷,在這樣模式下憋槐,每啟動(dòng)一個(gè)Activity都會(huì)重新創(chuàng)建一個(gè)Activity的新實(shí)例,并且將其加入任務(wù)棧中淑趾,而且完全不會(huì)去考慮這個(gè)實(shí)例是否已存在

b)singleTop,棧頂復(fù)用模式阳仔,顧名思義,在這種模式下扣泊,如果有新的Activity已經(jīng)存在任務(wù)棧的棧頂近范,那么此Activity就不會(huì)被重新創(chuàng)建新實(shí)例,而是復(fù)用已存在任務(wù)棧棧頂?shù)腁ctivity延蟹。這里重點(diǎn)是位于棧頂评矩,才會(huì)被復(fù)用,如果新的Activity的實(shí)例已存在但沒(méi)有位于棧頂阱飘,那么新的Activity仍然會(huì)被重建斥杜。需要注意的是,Activity的onNewIntent方法會(huì)被調(diào)用

c)singleTask,棧內(nèi)復(fù)用模式沥匈。這是一種單例模式蔗喂,與singTop點(diǎn)類似,只不過(guò)singTop是檢測(cè)棧頂元素是否有需要啟動(dòng)的Activity高帖,而singTask則是檢測(cè)整個(gè)棧中是否存在當(dāng)前需要啟動(dòng)的Activity弱恒,如果存在就直接將該Activity置于棧頂,并將該Activity以上的Activity都從任務(wù)棧中移出銷毀棋恼,同時(shí)也會(huì)回調(diào)onNewIntent方法

d)singleInstance模式下返弹,該Activity在整個(gè)android系統(tǒng)內(nèi)存中有且只有一個(gè)實(shí)例,而且該實(shí)例單獨(dú)尊享一個(gè)Task爪飘。換句話說(shuō)义起,A應(yīng)用需要啟動(dòng)的MainActivity 是singleInstance模式,當(dāng)A啟動(dòng)后师崎,系統(tǒng)會(huì)為它創(chuàng)建一個(gè)新的任務(wù)棧默终,然后A單獨(dú)在這個(gè)新的任務(wù)棧中,如果此時(shí)B應(yīng)用也要激活MainActivity犁罩,由于棧內(nèi)復(fù)用的特性齐蔽,則不會(huì)重新創(chuàng)建,而是兩個(gè)應(yīng)用共享一個(gè)Activity的實(shí)例

3)startActivityForResult和啟動(dòng)模式

startActivityForResult方法能夠起效:standard和singleTop

startActivityForResult方法不能夠起效:singleTask和singleInstance

1)只要將被啟動(dòng)的Activity屬性設(shè)置為singleTask則一定不起效

2)只要將被啟動(dòng)的Activity屬性設(shè)置為singleInstance則一定不起效

3)只要將啟動(dòng)的Activity模式設(shè)置為singleInstance則不論被啟動(dòng)的Activity為什么模式均不起效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末床估,一起剝皮案震驚了整個(gè)濱河市含滴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丐巫,老刑警劉巖谈况,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺美,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡碑韵,警方通過(guò)查閱死者的電腦和手機(jī)赡茸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)祝闻,“玉大人占卧,你說(shuō)我怎么就攤上這事×” “怎么了屉栓?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耸袜。 經(jīng)常有香客問(wèn)我友多,道長(zhǎng),這世上最難降的妖魔是什么堤框? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任域滥,我火速辦了婚禮,結(jié)果婚禮上蜈抓,老公的妹妹穿的比我還像新娘启绰。我一直安慰自己,他們只是感情好沟使,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布委可。 她就那樣靜靜地躺著,像睡著了一般腊嗡。 火紅的嫁衣襯著肌膚如雪着倾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天燕少,我揣著相機(jī)與錄音卡者,去河邊找鬼。 笑死客们,一個(gè)胖子當(dāng)著我的面吹牛崇决,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播底挫,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恒傻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了建邓?” 一聲冷哼從身側(cè)響起盈厘,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涝缝,沒(méi)想到半個(gè)月后扑庞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體譬重,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拒逮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年罐氨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滩援。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栅隐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玩徊,到底是詐尸還是另有隱情租悄,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布恩袱,位于F島的核電站泣棋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏畔塔。R本人自食惡果不足惜潭辈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澈吨。 院中可真熱鬧把敢,春花似錦、人聲如沸谅辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桑阶。三九已至柏副,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚣录,已是汗流浹背搓扯。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留包归,地道東北人锨推。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像公壤,于是被迫代替她去往敵國(guó)和親换可。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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