Activity的四種啟動模式

1. Android的軟件體系結(jié)構(gòu)

系統(tǒng)體系結(jié)構(gòu)圖.jpg

1.2 Task

task.png

Activity代碼屬于Application遮糖,但是Task屬于Android操作系統(tǒng)

Task是可以跨應(yīng)用的

手機查看Task:(用戶角度)

手機中按home鍵旁邊那個方形鍵(recent-apps)時袜蚕,屏幕上展示的就是一個個task换途。

查看Task.png

代碼中查看Task:(程序角度)

adb shell dumpsys activity activities | sed -En -e '/Stack #/p' -e '/Running activities/,/Run #0/p'

sed工具不用單獨下載掀潮,D:\soft\Git\usr\bin\sed.exe Git安裝目錄下包含米辐,配置下環(huán)境變量就可以洪己。

2.1 Task啟動方式(launcher啟動)

Launcher啟動

1洽故、Task不存在

2、Task存在

2.2 Task啟動方式(新建)

Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("message", "message");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

通知:

1.系統(tǒng)通知
2.自己

其他第三方應(yīng)用:

1笆凌、Scheme協(xié)議
2圣猎、第三方應(yīng)用start

launcher,新建 都是通過startActivity來創(chuàng)建的。

2.3 Task啟動方式(恢復(fù))

恢復(fù) 這屬于Activity生命周期由不可見到獲得焦點的范疇

Task恢復(fù).png

3.1 Activity和Fragment

Fragment是Android3.0后引入的一個新的API乞而,他出現(xiàn)的初衷是為了適應(yīng)大屏幕的平板電腦送悔, 當(dāng)然現(xiàn)在他仍然是平板APP UI設(shè)計的寵兒,而且我們普通手機開發(fā)也會加入這個Fragment爪模, 我們可以把他看成一個小型的Activity欠啤,又稱Activity片段!

fragment靜態(tài)加載.png
fragment動態(tài)加載.png

3.2 Activity的生命周期

Activity生命周期.png

Activity是否可見:

Activity是否可見.png

PS:Fragment生命周期

fragment生命周期

Activity與Fragment生命周期

Activity與Fragment生命周期

3.3 相鄰狀態(tài)之間的區(qū)別

A啟動B 和 B返回A.png

A啟動B 和 B返回A

1.onCreateonStart之間有什么區(qū)別呻右?

(1)可見與不可見的區(qū)別跪妥。前者不可見,后者可見声滥。
(2)執(zhí)行次數(shù)的區(qū)別眉撵。onCreate方法只在Activity創(chuàng)建時執(zhí)行一次,而onStart方法在Activity的切換以及按Home鍵返回桌面再切回應(yīng)用的過程中被多次調(diào)用落塑。因此Bundle數(shù)據(jù)的恢復(fù)在onStart中進(jìn)行比onCreate中執(zhí)行更合適纽疟。
(3)onCreate能做的事onStart其實都能做,但是onstart能做的事onCreate卻未必適合做憾赁。如前文所說的污朽,setContentView和資源初始化在兩者都能做,然而想動畫的初始化在onStart中做比較好龙考。

2.onStart方法和onResume方法有什么區(qū)別蟆肆?

(1)是否在前臺。onStart方法中Activity可見但不在前臺晦款,不可交互炎功,而在onResume中在前臺。
(2)職責(zé)不同缓溅,onStart方法中主要還是進(jìn)行初始化工作蛇损,而onResume方法,根據(jù)官方的建議坛怪,可以做開啟動畫和獨占設(shè)備的操作淤齐。

3.onPause方法和onStop方法有什么區(qū)別?

(1)是否可見袜匿。onPause時Activity可見更啄,onStop時Activity不可見,但Activity對象還在內(nèi)存中沉帮。
(2)在系統(tǒng)內(nèi)存不足的時候可能不會執(zhí)行onStop方法锈死,因此程序狀態(tài)的保存贫堰、獨占設(shè)備和動畫的關(guān)閉、以及一些數(shù)據(jù)的保存最好在onPause中進(jìn)行待牵,但要注意不能太耗時其屏。

4.onStop方法和onDestroy方法有什么區(qū)別?

onStop階段Activity還沒有被銷毀缨该,對象還在內(nèi)存中偎行,此時可以通過切換Activity再次回到該Activity,而onDestroy階段Acivity被銷毀

PS:閃屏頁:在onStop()方法中進(jìn)行finish();

3.4 onNewIntent的生命周期

onNewIntent.png

1贰拿、只對singleTop蛤袒,singleTask,singleInstance有效膨更,因為standard每次都是新建(不是絕對妙真,使用了Intent.FLAG_ACTIVITY_NEW_TASK,要啟動的Activity已經(jīng)有Task在運行了,新的activity不會再創(chuàng)建荚守,而是把當(dāng)前堆棧的activity帶到前臺)珍德,所以不存在onNewIntent;

2矗漾、只對startActivity有效锈候,對于從Navigation切換回來的恢復(fù)無效;

4.1 Activity啟動模式

四種啟動模式.png

4.2 standard啟動模式

1敞贡、standard 默認(rèn)模式

系統(tǒng)在啟動 Activity 的任務(wù)中創(chuàng)建 Activity 的新實例并向其傳送 Intent泵琳。Activity 可以多次實例化,不管這個實例是否已經(jīng)存在誊役,而每個實例均可屬于不同的任務(wù)获列,并且一個任務(wù)可以擁有多個實例。這種模式的 Activity 被創(chuàng)建時它的 onCreate蛔垢、onStart 都會被調(diào)用蛛倦。這是一種典型的多實例實現(xiàn),一個任務(wù)棧中可以有多個實例啦桌,每個實例也可以屬于不同的任務(wù)棧。在這種模式下及皂,誰啟動了這個 Activity甫男,那么這個 Activity 就運行在啟動它的那個 Activity 所在的棧中。

a验烧、當(dāng)從非Activity的context啟動activity時板驳,需要帶new_task的flag;

b碍拆、當(dāng)啟動一個帶有affinity的activity若治,如果這個activity已經(jīng)有實例存在該task慨蓝,則不會重新創(chuàng)建;

c端幼、如果從應(yīng)用內(nèi)啟動的standard activity的Affinity就是App默認(rèn)的Affinity礼烈,則會每次新建一個實例;

4.3 singleTop啟動模式

一個singleTop Activity 的實例可以無限多婆跑,唯一的區(qū)別是如果在棧頂已經(jīng)有一個相同類型的Activity實例此熬,Intent不會再創(chuàng)建一個Activity,而是通過onNewIntent()被發(fā)送到現(xiàn)有的Activity滑进。

singetop.png

4.4 singleTask模式

這是一種單實例模式犀忱,在這種模式下,只要 Activity 在一個棧中存在扶关,那么多次啟動此 Activity 都不會重新創(chuàng)建實例阴汇,和 singleTop一樣,系統(tǒng)也會回調(diào)其 onNewIntent节槐。當(dāng)一個具有 singleTask 模式的Activity請求啟動后搀庶,比如 Activity A,系統(tǒng)首先會尋找是否存在 A 想要的任務(wù)棧疯淫,如果不存在地来,就重新創(chuàng)建一個任務(wù)棧,然后創(chuàng)建 A 的實例后把 A 放到棧中熙掺。如果存在 A 所需的任務(wù)棧未斑,這時要看 A 是否在棧中有實例存在,如果有實例存在币绩,那么系統(tǒng)就會把 A 調(diào)到棧頂并調(diào)用它的 onNewIntent 方法蜡秽,如果實例不存在,就創(chuàng)建 A 的實例并把 A 壓入棧中 缆镣。

singleTask.png

不需要關(guān)注NEW_TASK

4.5 singleInstance模式

與 singleTask 相同芽突,只是系統(tǒng)不會將任何其他 Activity 啟動到包含實例的任務(wù)中。該 Activity 始終是其任務(wù)唯一僅有的成員董瞻;由此 Activity 啟動的任何 Activity 均在單獨的任務(wù)中打開寞蚌。也就是有此種模式的 Activity 只能單獨地位于一個任務(wù)棧中

PS:4種模式只能在AndroidManifest.xml中定義(定義層定義的)

4.6 Intent Activity Flag

啟動層定義

IntentFlag.png

5.1 啟動模式的應(yīng)用場景

launchMode 使用場景
singleTop 適合啟動同類型的 Activity,例如: ?接收通知啟動的內(nèi)容顯示頁面 ?耗時操作返回頁面 ?登錄頁面
singleTask 適合作為程序入口钠糊,例如: ?WebView頁面 ?掃一掃頁面 ?確認(rèn)訂單界面 ?付款界面
singleInstance 適合需要與程序分離開的頁面挟秤,例如: ?鬧鈴的響鈴界面 ?來電頁面 ?鎖屏頁
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抄伍,隨后出現(xiàn)的幾起案子艘刚,更是在濱河造成了極大的恐慌,老刑警劉巖截珍,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攀甚,死亡現(xiàn)場離奇詭異箩朴,居然都是意外死亡,警方通過查閱死者的電腦和手機秋度,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門炸庞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人静陈,你說我怎么就攤上這事燕雁。” “怎么了鲸拥?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵拐格,是天一觀的道長。 經(jīng)常有香客問我刑赶,道長捏浊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任撞叨,我火速辦了婚禮金踪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牵敷。我一直安慰自己胡岔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布枷餐。 她就那樣靜靜地躺著靶瘸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毛肋。 梳的紋絲不亂的頭發(fā)上怨咪,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音润匙,去河邊找鬼诗眨。 笑死,一個胖子當(dāng)著我的面吹牛孕讳,可吹牛的內(nèi)容都是我干的匠楚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼厂财,長吁一口氣:“原來是場噩夢啊……” “哼油啤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蟀苛,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逮诲,沒想到半個月后帜平,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幽告,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年裆甩,在試婚紗的時候發(fā)現(xiàn)自己被綠了冗锁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗤栓,死狀恐怖冻河,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茉帅,我是刑警寧澤叨叙,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站堪澎,受9級特大地震影響擂错,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜樱蛤,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一钮呀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昨凡,春花似錦爽醋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至就轧,卻和暖如春证杭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妒御。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工解愤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乎莉。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓送讲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惋啃。 傳聞我的和親對象是個殘疾皇子哼鬓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353