Android基礎(chǔ):Activity回顧(生命周期嗤堰、啟動(dòng)模式)

2017年的第一篇博客、今天開始整理以下Android所學(xué)到的東西告匠,這次整理Android基礎(chǔ)篇离唬。

四大組件最常用的莫過于Activity输莺。本文講從activity生命周期和啟動(dòng)模式

一裸诽、Activity的生命周期

activity生命周期.png

以上是來自官方的生命周期圖丈冬、看再多的博客都不如理解這樣圖來的快甘畅。

Activity主要有以下幾種執(zhí)行流程:

1疏唾、一般狀態(tài):Activity啟動(dòng)完成后點(diǎn)返回按鈕活調(diào)用finish方法

啟動(dòng) ----> onCreate----> onStart----> onResume
---- 運(yùn)行狀態(tài) ----
銷毀 ----> onPause----> onStop----> onDestroy---->end荸实!

2、遮蓋情況:Activity啟動(dòng)---->被遮蓋(可見)----> 返回Activity

場(chǎng)景:從A啟動(dòng)一個(gè)dialog
---- 運(yùn)行狀態(tài) ----
彈出Dialog: ----> onPause
Dialog消失: ----> onResume

3泄朴、跳轉(zhuǎn)情況:Activity啟動(dòng)---->被遮蓋(不可見)----> 返回Activity

場(chǎng)景:1祖灰、從A界面跳轉(zhuǎn)到B界面 2畔规、按下home按鍵
---- 運(yùn)行狀態(tài) ----
** A跳轉(zhuǎn)到B:**
---->A onPause-
---->B onCreate---->B onStart---->B onResume
---->A onStop
** B銷毀回A:** ---->A onRestart---->A onStart---->A onResume

4叁扫、異常情況:

當(dāng)activity調(diào)用onStop 存在于后臺(tái),此時(shí)activity處于Stopped狀態(tài)畴蒲、優(yōu)先級(jí)別較低
當(dāng)系統(tǒng)內(nèi)存不足時(shí)候可能直接銷毀 Activity
注:這種情況Activity不會(huì)執(zhí)行onDestroy方法

主要方法解釋:

public class MainActivity extends Activity {
    //(創(chuàng)建)(第一次創(chuàng)建/系統(tǒng)回收了重新創(chuàng)建時(shí))調(diào)用模燥。
    public void onCreate() 
    //(可見)Activity被激活掩宜,即將可見的時(shí)候調(diào)用
    public void onStart()
    //(獲取焦點(diǎn))Activity獲取焦點(diǎn)時(shí)候調(diào)用
    public void onResume()
    //(遮蓋可見)Activity被暫臀溃活動(dòng),此狀態(tài)Activity已經(jīng)失去用戶焦點(diǎn)固该,無法進(jìn)行交互但是任然可見糖儡。
    public void onPause()
    //(覆蓋不可見)Activity被完全停止握联,無法和用戶交互并且不可見每瞒。
    public void onStop()
    //(銷毀)Actiivty被銷毀了,并從Activity棧中壓出剿骨。
    public void onDestroy()
    //(重現(xiàn))Activity被重新激活浓利,一般出現(xiàn)在重新回到前臺(tái)時(shí)調(diào)用贷掖。
    public void onRestart()
}

注:當(dāng)Activity執(zhí)行onResume獲取焦點(diǎn)之后苹威,才開始測(cè)量繪制布局。
這也是為什么在onCreate掷酗、onStart和onResum方法中調(diào)用View.getMeasuredWidth獲取View大大小等于0的原因泻轰。

二糕殉、四種啟動(dòng)模式

  • standard-默認(rèn)模式
    1. 不論Activity實(shí)例存不存在殖告,每次啟動(dòng)都會(huì)創(chuàng)建該活動(dòng)的一個(gè)新的實(shí)例
    2. 誰啟動(dòng)了該模式的Activity黄绩,該Activity就屬于啟動(dòng)它的Activity的任務(wù)棧中
  • singleTop-棧頂復(fù)用模式
    singleTop模式分3種情況:

    1. 當(dāng)前棧中已有該Activity的實(shí)例并且該實(shí)例位于棧頂時(shí)爽丹,不會(huì)新建實(shí)例辛蚊,而是復(fù)用棧頂?shù)膶?shí)例袋马,并且會(huì)將Intent對(duì)象傳入秸应,回調(diào)onNewIntent方法(注意:不會(huì)執(zhí)行 onCreate----> onStart----> onResume任何方法)
    2. 當(dāng)前棧中已有該Activity的實(shí)例但是該實(shí)例不在棧頂時(shí)软啼,其行為和standard啟動(dòng)模式一樣祸挪,依然會(huì)創(chuàng)建一個(gè)新的實(shí)例
    3. 當(dāng)前棧中不存在該Activity的實(shí)例時(shí)贿条,其行為同standard啟動(dòng)模式整以、會(huì)創(chuàng)建一個(gè)實(shí)例
  • singleTask-棧內(nèi)復(fù)用模式
    singleTask啟動(dòng)模式啟動(dòng)Activity時(shí)悄蕾,首先會(huì)根據(jù)taskAffinity去尋找當(dāng)前是否存在一個(gè)對(duì)應(yīng)名字的任務(wù)棧

    1. 如果不存在帆调,則會(huì)創(chuàng)建一個(gè)新的Task番刊,并創(chuàng)建新的Activity實(shí)例入棧到新創(chuàng)建的Task中去
    2. 如果存在,則得到該任務(wù)棧蝉绷,查找該任務(wù)棧中是否存在該Activity實(shí)例
      • 如果存在實(shí)例熔吗,則將它上面的Activity實(shí)例都出棧桅狠,然后回調(diào)啟動(dòng)的Activity實(shí)例的onNewIntent方法
      • 如果不存在該實(shí)例中跌,則新建Activity漩符,并入棧

** 此外嗜暴,我們可以將兩個(gè)不同App中的Activity設(shè)置為相同的taskAffinity灼伤,這樣雖然在不同的應(yīng)用中狐赡,但是Activity會(huì)被分配到同一個(gè)Task中去颖侄。**

  • singleInstance-全局唯一模式
    會(huì)單獨(dú)開一個(gè)任務(wù)棧單獨(dú)存放這個(gè)activity览祖,這個(gè)任務(wù)棧只會(huì)在程序退出后消除展蒂。
    擁有singleTask的所有特性之外锰悼,此模式Activity只能單獨(dú)地位于一個(gè)新的任務(wù)棧中
    也就是箕般,Activity啟動(dòng)之后丝里,就會(huì)獨(dú)自在一個(gè)新的任務(wù)棧中杯聚,下次肯定不會(huì)重新創(chuàng)建該Activity,除非被系統(tǒng)殺死

注意:
1、standard、singleTop啟動(dòng)實(shí)例后會(huì)加入到默認(rèn)的Task中(默認(rèn)應(yīng)用的包名)奖唯,即使你指定了taskAffinity屬性不會(huì)啟動(dòng)新的Task丰捷;
2病往、singleTask停巷、singleInstance模式指定了taskAffinity屬性是會(huì)啟動(dòng)新的Task
3、盡量避免指定taskAffinity扒磁、和使用singleInstance模式缸榛、因?yàn)閯?chuàng)建新的Task耗性能不說坑還比較多
參考鏈接:徹底弄懂Activity四大啟動(dòng)模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市起暮,隨后出現(xiàn)的幾起案子负懦,更是在濱河造成了極大的恐慌,老刑警劉巖颗品,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件则吟,死亡現(xiàn)場(chǎng)離奇詭異氓仲,居然都是意外死亡敬扛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事按傅∥ㄉ埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長压汪。 經(jīng)常有香客問我腺阳,道長亭引,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮君丁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轰异。我一直安慰自己,他們只是感情好退疫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布薛躬。 她就那樣靜靜地躺著,像睡著了一般诡曙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慎璧,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼瑰排。 笑死,一個(gè)胖子當(dāng)著我的面吹牛京郑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播户魏,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼电禀,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼尖飞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纺酸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘟斜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年虽惭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了取劫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谱邪。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炮捧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惦银,到底是詐尸還是另有隱情咆课,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布扯俱,位于F島的核電站书蚪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏迅栅。R本人自食惡果不足惜殊校,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望读存。 院中可真熱鬧为流,春花似錦窜醉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至静汤,卻和暖如春琅催,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虫给。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工藤抡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抹估。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓缠黍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親药蜻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓷式,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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