Activity的四種啟動(dòng)模式

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)用的

手機(jī)查看Task:(用戶(hù)角度)

手機(jī)中按home鍵旁邊那個(gè)方形鍵(recent-apps)時(shí),屏幕上展示的就是一個(gè)個(gè)task。

查看Task.png

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

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

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

2.1 Task啟動(dòng)方式(launcher啟動(dòng))

Launcher啟動(dòng)

1、Task不存在

2、Task存在

2.2 Task啟動(dòng)方式(新建)

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,新建 都是通過(guò)startActivity來(lái)創(chuàng)建的。

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

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

Task恢復(fù).png

3.1 Activity和Fragment

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

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

3.2 Activity的生命周期

Activity生命周期.png

Activity是否可見(jiàn):

Activity是否可見(jiàn).png

PS:Fragment生命周期

fragment生命周期

Activity與Fragment生命周期

Activity與Fragment生命周期

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

A啟動(dòng)B 和 B返回A.png

A啟動(dòng)B 和 B返回A

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

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

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

(1)是否在前臺(tái)。onStart方法中Activity可見(jiàn)但不在前臺(tái),不可交互,而在onResume中在前臺(tái)。
(2)職責(zé)不同,onStart方法中主要還是進(jìn)行初始化工作,而onResume方法,根據(jù)官方的建議,可以做開(kāi)啟動(dòng)畫(huà)和獨(dú)占設(shè)備的操作。

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

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

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

onStop階段Activity還沒(méi)有被銷(xiāo)毀,對(duì)象還在內(nèi)存中,此時(shí)可以通過(guò)切換Activity再次回到該Activity,而onDestroy階段Acivity被銷(xiāo)毀

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

3.4 onNewIntent的生命周期

onNewIntent.png

1、只對(duì)singleTop,singleTask,singleInstance有效,因?yàn)閟tandard每次都是新建(不是絕對(duì),使用了Intent.FLAG_ACTIVITY_NEW_TASK,要啟動(dòng)的Activity已經(jīng)有Task在運(yùn)行了,新的activity不會(huì)再創(chuàng)建,而是把當(dāng)前堆棧的activity帶到前臺(tái)),所以不存在onNewIntent;

2、只對(duì)startActivity有效,對(duì)于從Navigation切換回來(lái)的恢復(fù)無(wú)效;

4.1 Activity啟動(dòng)模式

四種啟動(dòng)模式.png

4.2 standard啟動(dòng)模式

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

系統(tǒng)在啟動(dòng) Activity 的任務(wù)中創(chuàng)建 Activity 的新實(shí)例并向其傳送 Intent。Activity 可以多次實(shí)例化,不管這個(gè)實(shí)例是否已經(jīng)存在,而每個(gè)實(shí)例均可屬于不同的任務(wù),并且一個(gè)任務(wù)可以擁有多個(gè)實(shí)例。這種模式的 Activity 被創(chuàng)建時(shí)它的 onCreate、onStart 都會(huì)被調(diào)用。這是一種典型的多實(shí)例實(shí)現(xiàn),一個(gè)任務(wù)棧中可以有多個(gè)實(shí)例,每個(gè)實(shí)例也可以屬于不同的任務(wù)棧。在這種模式下,誰(shuí)啟動(dòng)了這個(gè) Activity,那么這個(gè) Activity 就運(yùn)行在啟動(dòng)它的那個(gè) Activity 所在的棧中。

a、當(dāng)從非Activity的context啟動(dòng)activity時(shí),需要帶new_task的flag;

b、當(dāng)啟動(dòng)一個(gè)帶有affinity的activity,如果這個(gè)activity已經(jīng)有實(shí)例存在該task,則不會(huì)重新創(chuàng)建;

c、如果從應(yīng)用內(nèi)啟動(dòng)的standard activity的Affinity就是App默認(rèn)的Affinity,則會(huì)每次新建一個(gè)實(shí)例;

4.3 singleTop啟動(dòng)模式

一個(gè)singleTop Activity 的實(shí)例可以無(wú)限多,唯一的區(qū)別是如果在棧頂已經(jīng)有一個(gè)相同類(lèi)型的Activity實(shí)例,Intent不會(huì)再創(chuàng)建一個(gè)Activity,而是通過(guò)onNewIntent()被發(fā)送到現(xiàn)有的Activity。

singetop.png

4.4 singleTask模式

這是一種單實(shí)例模式,在這種模式下,只要 Activity 在一個(gè)棧中存在,那么多次啟動(dòng)此 Activity 都不會(huì)重新創(chuàng)建實(shí)例,和 singleTop一樣,系統(tǒng)也會(huì)回調(diào)其 onNewIntent。當(dāng)一個(gè)具有 singleTask 模式的Activity請(qǐng)求啟動(dòng)后,比如 Activity A,系統(tǒng)首先會(huì)尋找是否存在 A 想要的任務(wù)棧,如果不存在,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建 A 的實(shí)例后把 A 放到棧中。如果存在 A 所需的任務(wù)棧,這時(shí)要看 A 是否在棧中有實(shí)例存在,如果有實(shí)例存在,那么系統(tǒng)就會(huì)把 A 調(diào)到棧頂并調(diào)用它的 onNewIntent 方法,如果實(shí)例不存在,就創(chuàng)建 A 的實(shí)例并把 A 壓入棧中 。

singleTask.png

不需要關(guān)注NEW_TASK

4.5 singleInstance模式

與 singleTask 相同,只是系統(tǒng)不會(huì)將任何其他 Activity 啟動(dòng)到包含實(shí)例的任務(wù)中。該 Activity 始終是其任務(wù)唯一僅有的成員;由此 Activity 啟動(dòng)的任何 Activity 均在單獨(dú)的任務(wù)中打開(kāi)。也就是有此種模式的 Activity 只能單獨(dú)地位于一個(gè)任務(wù)棧中

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

4.6 Intent Activity Flag

啟動(dòng)層定義

IntentFlag.png

5.1 啟動(dòng)模式的應(yīng)用場(chǎng)景

launchMode 使用場(chǎng)景
singleTop 適合啟動(dòng)同類(lèi)型的 Activity,例如: ?接收通知啟動(dòng)的內(nèi)容顯示頁(yè)面 ?耗時(shí)操作返回頁(yè)面 ?登錄頁(yè)面
singleTask 適合作為程序入口,例如: ?WebView頁(yè)面 ?掃一掃頁(yè)面 ?確認(rèn)訂單界面 ?付款界面
singleInstance 適合需要與程序分離開(kāi)的頁(yè)面,例如: ?鬧鈴的響鈴界面 ?來(lái)電頁(yè)面 ?鎖屏頁(yè)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容