Activity基礎(chǔ)相關(guān)(持續(xù)完善)

這里是對(duì)Activity一些基礎(chǔ)知識(shí)的總結(jié),有問(wèn)題歡迎指正瘤载,有遺漏的地方否灾,歡迎補(bǔ)充。
PS:我是現(xiàn)在從事游戲開(kāi)發(fā)鸣奔,比較喜歡Android墨技,想以后有機(jī)會(huì)做Android開(kāi)發(fā)!

Activity的生命周期

這里主要是參考了這位同學(xué)的博客挎狸,然后我本地調(diào)試了一下扣汪。

 public class OurActivity extends Activity { 
    protected void onCreate(Bundle savedInstanceState); 
    protected void onStart(); 
    protected void onResume(); 
    protected void onPause(); 
    protected void onStop(); 
    protected void onDestroy(); 
 }
  1. onCreate(Bundle savedInstanceState)Activity處于不可視化,在這個(gè)過(guò)程中主要是一些數(shù)據(jù)锨匆,視圖資源的初始化工作崭别。
  2. onStart()Activity從不可視化到可視化狀態(tài)的過(guò)程,讓Activity在后臺(tái)顯示恐锣。
  3. onResume()這個(gè)方法執(zhí)行完成以后已經(jīng)在前臺(tái)顯示茅主,可以進(jìn)行用戶交互。
  4. onPause()Activity正在停止土榴,一般會(huì)緊接著onStop()诀姚。
  5. onStop()Activity即將停止。
  6. onDestroy()Activity從即將被銷毀玷禽,可以在這里做一些回收工作和最終資源釋放赫段。
  • 當(dāng)Activity切換到桌面再回到Activity:onPause()onStop()onRestart()onStart()onResume()
    當(dāng)Aty1切換到Aty2過(guò)程:onPause_1()→onCreate_2()→onStart_2()→onResume_2()→onStop_1(),這個(gè)過(guò)程需要注意的就是onPause_1()中不能做耗時(shí)操作
    當(dāng)手機(jī)橫豎屏切換的時(shí)候:
    onPause()→onStop()→onDestroy()→onCreate()→onStart()→onResume()**

銷毀:當(dāng)系統(tǒng)配置發(fā)生改變后,Activity會(huì)被銷毀矢赁,其onPause,onStop,onDestroy方法都會(huì)調(diào)用糯笙,由于是異常狀態(tài)下終止,所以會(huì)調(diào)用onSaveInstanceState方法來(lái)保存當(dāng)前Activity的狀態(tài)(視圖結(jié)構(gòu)撩银、輸入的數(shù)據(jù)给涕、ListView滾動(dòng)的位置等);這個(gè)方法的調(diào)用時(shí)機(jī)是在onStop之前,可能在onPause之前或之后稠炬。

恢復(fù):重新創(chuàng)建時(shí)會(huì)調(diào)用onRestoreInstanceState焕阿,把剛剛onSaveInstanceState方法所保存的Bundle對(duì)象傳遞給onRestoreInstanceState和onCreate方法咪啡。onRestoreInstance發(fā)生在onStart之后首启。

Activity的加載模式

首先在看加載模式之前,我們需要先了解一下Task和Back Stack撤摸。關(guān)于這一塊的詳細(xì)講解請(qǐng)看這位同學(xué)的博客,已經(jīng)分析的相當(dāng)透徹毅桃!

  1. Task基本工作原理介紹:Task是我們?cè)谕瓿赡稠?xiàng)工作時(shí)所交互的Activity的集合。這些Activity按照打開(kāi)的順序被放置在同一個(gè)棧中准夷,這個(gè)棧被稱為Back Stack钥飞。當(dāng)我們點(diǎn)擊桌面上的launcher圖標(biāo)時(shí),對(duì)應(yīng)的Task會(huì)被置換到前臺(tái)衫嵌。如果這個(gè)應(yīng)用不存在Task读宙,就會(huì)創(chuàng)建一個(gè)新的Task,此時(shí)應(yīng)用的MainActivity就會(huì)被創(chuàng)建楔绞,壓入Back Stack中结闸。當(dāng)從當(dāng)前Activity啟動(dòng)到一個(gè)新的Activity的時(shí)候,新的Activity會(huì)被壓入棧中酒朵,之前的Activity會(huì)處于停止?fàn)顟B(tài)桦锄。當(dāng)我們按返回鍵時(shí),新的Activity會(huì)被出棧并銷毀蔫耽,之前的Activity會(huì)恢復(fù)狀態(tài)结耀。當(dāng)我們按返回鍵回到桌面,此時(shí)所有的Activity已經(jīng)出棧匙铡,然后Task被銷毀图甜。
  2. 保存Activity的狀態(tài):當(dāng)Activity停止(Stoped)時(shí),系統(tǒng)會(huì)默認(rèn)保存其狀態(tài)鳖眼。當(dāng)我們通過(guò)back鍵返回到這個(gè)Activity的時(shí)候就會(huì)恢復(fù)到離開(kāi)時(shí)的界面具则。當(dāng)然,也會(huì)存在多個(gè)Task同時(shí)存在的情況具帮,內(nèi)存緊張時(shí)可能會(huì)銷毀后臺(tái)的Activity博肋,回收內(nèi)存。在這種情況下蜂厅,系統(tǒng)仍然會(huì)知道Activity在Task中的位置匪凡,當(dāng)通過(guò)back鍵回到這個(gè)Activity時(shí),系統(tǒng)會(huì)重新創(chuàng)建一個(gè)Activity掘猿,而不是之前那種Resume病游。因此,為了不丟失Activity的內(nèi)容,可以通過(guò)實(shí)現(xiàn)onSaveInstanceState()方法主動(dòng)保存數(shù)據(jù)衬衬,但是值得一提的是onSaveInstanceState()在我們一直按back鍵退出的時(shí)候买猖,是不會(huì)調(diào)用的,因此一些永久性的數(shù)據(jù)需要用onPause()方法保存滋尉。

加載模式:

  1. 設(shè)置一個(gè)launchMode玉控,兩種方法:
  • 可以直接在AndroidManifest.xml <activity>標(biāo)簽的一個(gè)屬性中設(shè)置launchMode,如下:
  <activity
  android:name=".SingleTaskActivity"
  android:label="singleTask launchMode"
  android:launchMode="singleTask">
  • 通過(guò)叫做 Intent addFlags方法設(shè)置更多的行為狮惜,比如:
  Intent intent = new Intent(StandardActivity.this, StandardActivity.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  startActivity(intent);
  1. Activity的四種啟動(dòng)模式:
  • standard:Activity的默認(rèn)啟動(dòng)方式高诺。啟動(dòng)的Activity都會(huì)壓進(jìn)上面所說(shuō)的Back Stack中。這種方式啟動(dòng)Activity每次都會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例碾篡。

  • singleTop:對(duì)應(yīng)的Flags為FLAG_ACTIVITY_SINGLE_TOP虱而。啟動(dòng)Activity之前,都會(huì)先判斷Back Stack頂部的Activity是不是要啟動(dòng)的Activity开泽。如果不是牡拇,則新創(chuàng)建一個(gè)新的Activity。如果是穆律,則直接引用惠呼,但是會(huì)在Activity啟動(dòng)的時(shí)候調(diào)用onNewIntent()方法。此時(shí)這個(gè)Activity生命周期方法為onNewIntent()→onRestart()→onStart()→onResume()众旗,因此如果遇到這種情況罢杉,我們應(yīng)該在onNewIntent()做對(duì)應(yīng)的數(shù)據(jù)處理方法。但是贡歧,需要注意的是系統(tǒng)隨時(shí)可能殺死后臺(tái)運(yùn)行的Activity滩租,如果對(duì)應(yīng)的Activity被殺死了,那么系統(tǒng)就不會(huì)調(diào)用上面說(shuō)的onNewIntent()利朵,而是調(diào)用onCreate()方法律想。所以為了保險(xiǎn)起見(jiàn)最好在onCreate()中也要有相同邏輯的初始化方法。

  • singleTask:對(duì)應(yīng)的Flags為FLAG_ACTIVITY_NEW_TASK绍弟。如果當(dāng)前要啟動(dòng)的Activity已經(jīng)存在于Back Stack中(之前已經(jīng)創(chuàng)建了一個(gè)對(duì)應(yīng)的Activity的實(shí)例)技即,會(huì)直接使用已經(jīng)存在的Activity,并且把它上面的活動(dòng)都給彈出樟遣。如果沒(méi)有則創(chuàng)建一個(gè)新的活動(dòng)實(shí)例而叼。

  • singleInstance:聲明為singleInstance的Activity會(huì)出現(xiàn)在一個(gè)新的任務(wù)棧中,而且該任務(wù)棧中只存在這一個(gè)Activity豹悬。除非這個(gè)任務(wù)棧被銷毀了葵陵,否則后續(xù)的請(qǐng)求均不會(huì)創(chuàng)建新的實(shí)例。每個(gè)Activity都有一個(gè)自己的任務(wù)棧瞻佛,除了singleInstance脱篙,剩下的啟動(dòng)模式下,Activity都是被保存在了自己App的任務(wù)棧里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绊困,隨后出現(xiàn)的幾起案子文搂,更是在濱河造成了極大的恐慌,老刑警劉巖秤朗,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煤蹭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡川梅,警方通過(guò)查閱死者的電腦和手機(jī)疯兼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)然遏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贫途,“玉大人,你說(shuō)我怎么就攤上這事待侵《纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵秧倾,是天一觀的道長(zhǎng)怨酝。 經(jīng)常有香客問(wèn)我,道長(zhǎng)那先,這世上最難降的妖魔是什么农猬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮售淡,結(jié)果婚禮上斤葱,老公的妹妹穿的比我還像新娘。我一直安慰自己揖闸,他們只是感情好揍堕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著汤纸,像睡著了一般衩茸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贮泞,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天楞慈,我揣著相機(jī)與錄音,去河邊找鬼啃擦。 笑死囊蓝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的议惰。 我是一名探鬼主播慎颗,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了俯萎?” 一聲冷哼從身側(cè)響起傲宜,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夫啊,沒(méi)想到半個(gè)月后函卒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撇眯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年报嵌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熊榛。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锚国,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玄坦,到底是詐尸還是另有隱情血筑,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布煎楣,位于F島的核電站豺总,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏择懂。R本人自食惡果不足惜喻喳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望困曙。 院中可真熱鬧表伦,春花似錦、人聲如沸赂弓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盈魁。三九已至翔怎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杨耙,已是汗流浹背赤套。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珊膜,地道東北人容握。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像车柠,于是被迫代替她去往敵國(guó)和親剔氏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子塑猖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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