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

1.2 Task

Activity代碼屬于Application,但是Task屬于Android操作系統(tǒng)
Task是可以跨應(yīng)用的
手機(jī)查看Task:(用戶(hù)角度)
手機(jī)中按home鍵旁邊那個(gè)方形鍵(recent-apps)時(shí),屏幕上展示的就是一個(gè)個(gè)task。

代碼中查看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)的范疇

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片段!


3.2 Activity的生命周期

Activity是否可見(jiàn):

PS:Fragment生命周期

Activity與Fragment生命周期

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

A啟動(dòng)B 和 B返回A
1.onCreate和onStart之間有什么區(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的生命周期

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)模式

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。

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 壓入棧中 。

不需要關(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)層定義

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è) |