從四個視角理解Activity的啟動模式

2020-10-09 18:01:10

在這裡插入圖片描述

1、Android軟體體系架構

1.1 Android的軟體體系結構

在這裡插入圖片描述
靜態視角

1.2 Tasks

在這裡插入圖片描述
在這裡插入圖片描述

Activity程式碼屬於Application,但是Task屬於Android作業系統

1.3 怎樣檢視Tasks

在這裡插入圖片描述
adb shell dumpsys activity activities | sed -En -e ‘/Stack #/p’ -e ‘/Running activities/,/Run #0/p’
在這裡插入圖片描述
每個Task保護哪些Actvity

2、Activity的啟動方式

2.1 Task的啟動方式(恢復)

在這裡插入圖片描述
在這裡插入圖片描述

2.2 Task啟動方式(新建)

在這裡插入圖片描述
在這裡插入圖片描述
1、Scheme
2、第三方應用start

2.3 Laucher啟動

在這裡插入圖片描述
Laucher啟動
1、Task不存在
2、Task已經存在
在這裡插入圖片描述

3、Activity & Fragment的生命週期

3.1 Activity和Fragment

Fragment是Android3.0後引入的一個新的API,他出現的初衷是為了適應大螢幕的平板電腦, 當然現在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段!
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

3.2 Activity的生命週期

在這裡插入圖片描述

在這裡插入圖片描述

3.3 相鄰狀態之間的區別

在這裡插入圖片描述
1.onCreate和onStart之間有什麼區別?
(1)可見與不可見的區別。前者不可見,後者可見。(2)執行次數的區別。onCreate方法只在Activity建立時執行一次,而onStart方法在Activity的切換以及按Home鍵返回桌面再切迴應用的過程中被多次呼叫。因此Bundle資料的恢復在onStart中進行比onCreate中執行更合適。(3)onCreate能做的事onStart其實都能做,但是onstart能做的事onCreate卻未必適合做。如前文所說的,setContentView和資源初始化在兩者都能做,然而想動畫的初始化在onStart中做比較好。
2.onStart方法和onResume方法有什麼區別?
(1)是否在前臺。onStart方法中Activity可見但不在前臺,不可互動,而在onResume中在前臺。(2)職責不同,onStart方法中主要還是進行初始化工作,而onResume方法,根據官方的建議,可以做開啟動畫和獨佔裝置的操作。
3.onPause方法和onStop方法有什麼區別?
(1)是否可見。onPause時Activity可見,onStop時Activity不可見,但Activity物件還在記憶體中。(2)在系統記憶體不足的時候可能不會執行onStop方法,因此程式狀態的儲存、獨佔裝置和動畫的關閉、以及一些資料的儲存最好在onPause中進行,但要注意不能太耗時。
4.onStop方法和onDestroy方法有什麼區別?
onStop階段Activity還沒有被銷燬,物件還在記憶體中,此時可以通過切換Activity再次回到該Activity,而onDestroy階段Acivity被銷燬

3.4 onNewIntent的生命週期

在這裡插入圖片描述

1、只對singleTop,singleTask,singleInstance有效,因為standard每次都是新建,所以不存在onNewIntent;
2、只對startActivity有效,對於從Navigation切換回來的恢復無效;

4、Standard等4種啟動模式

4.1 Activity啟動模式

在這裡插入圖片描述

4.2 standard啟動模式

1、standard 預設模式
系統在啟動 Activity 的任務中建立 Activity 的新範例並向其傳送 Intent。Activity 可以多次範例化,不管這個範例是否已經存在,而每個範例均可屬於不同的任務,並且一個任務可以擁有多個範例。這種模式的 Activity 被建立時它的 onCreate、onStart 都會被呼叫。這是一種典型的多範例實現,一個任務棧中可以有多個範例,每個範例也可以屬於不同的任務棧。在這種模式下,誰啟動了這個 Activity,那麼這個 Activity 就執行在啟動它的那個 Activity 所在的棧中。

a、當從非Activity的context啟動activity時,需要帶new_task的flag;
b、當啟動一個帶有affinity的activity,如果這個activity已經有範例存在該task,則不會重新建立;
c、如果從應用內啟動的standard activity的Affinity就是App預設的Affinity,則會每次新建一個範例;

4.3 singleTop啟動模式

一個singleTop Activity 的範例可以無限多,唯一的區別是如果在棧頂已經有一個相同型別的Activity範例,Intent不會再建立一個Activity,而是通過onNewIntent()被傳送到現有的Activity。
在這裡插入圖片描述

4.4 singleTask模式

這是一種單範例模式,在這種模式下,只要 Activity 在一個棧中存在,那麼多次啟動此 Activity 都不會重新建立範例,和 singleTop一樣,系統也會回撥其 onNewIntent。當一個具有 singleTask 模式的Activity請求啟動後,比如 Activity A,系統首先會尋找是否存在 A 想要的任務棧,如果不存在,就重新建立一個任務棧,然後建立 A 的範例後把 A 放到棧中。如果存在 A 所需的任務棧,這時要看 A 是否在棧中有範例存在,如果有範例存在,那麼系統就會把 A 調到棧頂並呼叫它的 onNewIntent 方法,如果範例不存在,就建立 A 的範例並把 A 壓入棧中 。
在這裡插入圖片描述

4.5 singleInstance模式

與 singleTask 相同,只是系統不會將任何其他 Activity 啟動到包含範例的任務中。該 Activity 始終是其任務唯一僅有的成員;由此 Activity 啟動的任何 Activity 均在單獨的任務中開啟。也就是有此種模式的 Activity 只能單獨地位於一個任務棧中

4.6 Intent Activity Flag

在這裡插入圖片描述
只對standard和singleTop有效

5、啟動模式應用場景

5.1 啟動模式的應用場景

在這裡插入圖片描述

5.2 課程總結

在這裡插入圖片描述