1. Android的軟件體系結(jié)構(gòu)
1.2 Task
Activity代碼屬于Application遮糖,但是Task屬于Android操作系統(tǒng)
Task是可以跨應(yīng)用的
手機查看Task:(用戶角度)
手機中按home鍵旁邊那個方形鍵(recent-apps)時袜蚕,屏幕上展示的就是一個個task换途。
代碼中查看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生命周期由不可見到獲得焦點的范疇
3.1 Activity和Fragment
Fragment是Android3.0后引入的一個新的API乞而,他出現(xiàn)的初衷是為了適應(yīng)大屏幕的平板電腦送悔, 當(dāng)然現(xiàn)在他仍然是平板APP UI設(shè)計的寵兒,而且我們普通手機開發(fā)也會加入這個Fragment爪模, 我們可以把他看成一個小型的Activity欠啤,又稱Activity片段!
3.2 Activity的生命周期
Activity是否可見:
PS:Fragment生命周期
Activity與Fragment生命周期
3.3 相鄰狀態(tài)之間的區(qū)別
A啟動B 和 B返回A
1.onCreate和onStart之間有什么區(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的生命周期
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啟動模式
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滑进。
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 壓入棧中 缆镣。
不需要關(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
啟動層定義
5.1 啟動模式的應(yīng)用場景
launchMode | 使用場景 |
---|---|
singleTop | 適合啟動同類型的 Activity,例如: ?接收通知啟動的內(nèi)容顯示頁面 ?耗時操作返回頁面 ?登錄頁面 |
singleTask | 適合作為程序入口钠糊,例如: ?WebView頁面 ?掃一掃頁面 ?確認(rèn)訂單界面 ?付款界面 |
singleInstance | 適合需要與程序分離開的頁面挟秤,例如: ?鬧鈴的響鈴界面 ?來電頁面 ?鎖屏頁 |