Android6.0之Activity的管理與啟動模式
前面分析到了ActivityStackSupervisor類中的startActivityLocked方法,在分析這個方法前,先介紹一些關於Activity的知識,以方便我們理解程式碼.
Task
Task是一個棧,它的作用是以先進後退的方式組織Activity。
Android把使用者一次操作相關的Activity按照先後順序儲存在一個Task中,這樣當用戶按back鍵時,就能按照相反的順序退回去.
系統執行時記憶體中可能存在多個Task,當我們按Recent鍵(android手機中的選單鍵,或者多工鍵)時,會彈出一個列表讓你選擇,這個列表就是系統中存在的Task集合.選擇一個Task時,將把它所包含的所有Activity作為一個成體帶到前臺.Task中的Activity的順序通常是不能改變的,只能是入棧或出棧.
AMS中使用TaskRecord類來表示Task.
原始碼路徑:
1
|
Android-6/frameworks/base/services/core/java/com/android/server/am/TaskRecord.java
|
預設模式,可以不用寫配置。在這個模式下,都會預設建立一個新的例項。因此,在這種模式下,可以有多個相同的例項,也允許多個相同Activity疊加
類定義節選如下,可以參考程式碼註釋來理解.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
final class TaskRecord { ........... final int taskId; // Unique identifier for this task. int mAffiliatedTaskId; // taskId of parent affiliation or self if no parent. // 可以理解為當前task的name String affinity; // The affinity name for this task, or null; may change identity. |
變數affinity是這個Task的名字,affinity在AMS中是唯一的,AMS查詢一個Task,優先比較它的affinity.
task是該Activity所在的Task,可以在AndroidManifest.xml中以下面的形式指出該activity的所在task的名字.
1 2 3 4 5 |
<activity android:name=".Activity1" android:taskAffinity="****task名字***" </activity> |
一個Task的affinity只有在其被建立的時候才有用.以後加入這個task的Activity,即使他們通過taskAffinity指定了了一個不同的字串,也不會改變task的名稱.
通常不會主動去設定一個Activity的taskAffinity屬性,如果不設定的話,繼承標籤中的taskAffinity屬性值.如果中也沒有指定taskAffinity,那麼預設使用包名.
正因為如此,應用中的所有Activity的taskAffinity屬性值預設狀態下是相同的,都是包名.所以在應用中使用FLAG_ACTIVITY_NEW_TASK標誌去啟動一個本應用中的一個activity,也不會建立一個新的task,除非這個activity額外指定了不同的taskAffinity屬性值.
ActivityRecord
一個Activity在AMS中是使用類ActivityRecord表示的.
原始碼路徑:
1
|
Android-6/frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java
|
節選定義如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
final class ActivityRecord { .................. final ActivityManagerService service; // owner final IApplicationToken.Stub appToken; // window manager token\ //從AndroidManifest.xml中得到的該activity的基本資訊 final ActivityInfo info; // all about me final ApplicationInfo appInfo; // information about activity's app final Intent intent; // the original intent that generated us final String processName; // process where this component wants to run // 所在task名字 final String taskAffinity; // as per ActivityInfo.taskAffinity int icon; // resource identifier of activity's icon. int logo; // resource identifier of activity's logo. int theme; // resource identifier of activity's theme. // 這個activity所在的Task TaskRecord task; // the task this is in. // 這個Activity執行所在的程序 ProcessRecord app; // if non-null, hosting application ActivityState state; // current state we are in PersistableBundle persistentState; // last persistently saved activity state boolean frontOfTask; // is this the root activity of its task? // Activity啟動模式 int launchMode; // the launch mode activity attribute. private boolean inHistory; // are we in the history stack? final ActivityStackSupervisor mStackSupervisor; .................. } |
ActivityStack
AMS中使用ActivityStack類來管理Task.
原始碼路徑:
1
|
Android-6/frameworks/base/services/core/java/com/android/server/am/ActivityStack.java
|
節選定義如下:
1 2 3 4 5 6 7 8 9 10 |