天天看點

Activity棧管理1.四大元件在AMS中存在形式2.Activity生命周期狀态3.Activity管理體系4.Activity管理相關類 

AMS在系統中的作用之一就是管理四大元件,那麼四大元件在AMS中必須以某種形式存在。

1.四大元件在AMS中存在形式

  1. ActivityRecord,用于描述Activity基本資訊,由ActivityStackSupervison管理。
  2. ServiceRecord,描述service元件資訊,由ActivityServices負責管理。
  3. BroadCastRecord,描述了應用程序的BroadCastReceiver,由BroadCastQueue管理。
  4. ContentProviderRecord,描述ContentProvider内容提供者資訊,由ProviderMap管理

2.Activity生命周期狀态

2.1 clien端---應用程式端:

Activity在應用端是由ActivityClientRecord來描述其生命周期的。

一個應用程式的入口是ActivityThread類,在該類中有一個内部類ApplicationThread類,它是一個binder,主要作用是應用程式和AMS進行通訊的,在ApplicationThread類中,關于生命周期的方法有:

scheduleLaunchActivity()

scheduleResumeActivity()

schedulePauseActivity()

scheduleStopActivity()

scheduleDestoryActivity()

scheduleRelaunchActivity()

scheduleWindowVisibility()

這些方法都是在Binder線程,而不是在主線程ActivityThread中,是以這些方法收到ASM消息後,會通過Handler發送對應的消息到主線程中,然後主線程中通過handler去處理對應的消息。

每一個schedule...Activity方法都會在主線程中對應一個handle...Activity方法,然後在handle...Activity方法中會根據需要進一步分解來處理,其中面向Activity的操作被統一命名為perform...Activity方法。

PS:schedule...Activity ------>handle...Activity----->perform....Activity

2.2 server端---AMS端

在AMS中,Activity的狀态是由枚舉類ActivityState來描述的。

INITIALIZING:正在初始化

STARTED:前台狀态

RESUMED:恢複前台狀态

PAUSING:正在暫停

PAUSED:暫停狀态

STOPPING:正在停止

STOPPED:停止狀态

FINISHING:正在移除

DESTROYING:正在銷毀

DESTROYED:銷毀狀态

RESTARTING_PROCESS:程序重新開機中

3.Activity管理體系

Activity棧管理1.四大元件在AMS中存在形式2.Activity生命周期狀态3.Activity管理體系4.Activity管理相關類 

4.Activity管理相關類 

4.1ActivityRecord

一個ActivityRecord描述了一個啟動的Activity,一個Activity可以由于啟動方式的原因存在多個ActivityRecord執行個體。

成員變量:

ProcessRecord app:運作在哪個程序

TaskRecord task:運作在哪個Task中

ActivityInfo info:Activity資訊

Int mActivityType :Activity類型

APPLICATION_ACTIVITY_TYPE:普通應用類型

HOME_ACTIVITY_TYPE:桌面類型

RECENTS_ACTIVITY_TYPE:最近任務類型

ActivityState state:Activity狀态

Int launchMode:該activity的啟動模式

Int userId:act運作在哪個使用者id

4.2 TaskRecord

Activity任務棧,内部維護一個ArrayList<ActivityRecord>清單,安卓把有關聯的ActivityRecord會放在一個TaskRecord中。

成員變量:

ActivityStack stack:目前所屬的stack

ArrayList mActivitys:目前Task中所有的activity清單

String affinity:是指root activity的affinity,該Task中第一個activity的affinity。

String mCallingPackage:調用者的包名

Int taskId:此任務的唯一辨別符。

ActivityRecord mPausingActivity :正在pause

ActivityRecord mResumedActivity :已經resumed

說明:

TaskRecord 的affinity隻有在其被建立的時候才有用,以後加入這個Task的Activity,即使他們通過taskAffinity指定了一個不同的字元串,也不會更改Task的名稱;Activity所在的Task通過AndroidManifest.xml中<Activity>标簽中的android:taskAffinity="xxx"來指定,通常不去主動設定一個Activity的taskAffinity屬性,那麼taskAffinity的值預設使用包名。正因為如此,應用中所有的Activity的taskAffinity屬性值預設都是相同的,都是包名,是以在應用中使用FLAG_ACTIVITY_NEW_TASK标志去啟動一個本應用中的一個Activity,也不會建立一個新的task,除非這個Activity 額外指定了不同的taskAffinity屬性值;

4.3 ActivityStack

充當TaskRecord的管理者角色,由多個或一個TaskRecord序列組成。

成員變量:

ArrayList<TaskRecord> mTaskHistory:儲存所有的TaskRecord

ArrayList<ActivityRecord> mLRUActivites:最近活動的ActivityRecord;

Int mstackId:ActivityStack的唯一辨別

ActivityStackSupervisor mStackSupervisor:ActivityStack的管理者

ActivityStack mHomeStack :桌面的stack

ActivityStack mFocusedStack :目前聚焦stack

ActivityStack mLastFocusedStack :正在切換

ActivityContainer mActivityContainer :ActivityStack的容器類,它負責描述ActivityStack,包括其StackId、所屬Display、容器狀态等。ActivityContainer繼承自IActivityContainer.Stub,支援binder調用,顯而易見的是,它與其負責描述ActivityStack是一對一關系。\

PS:

對于主屏也就是DEFAULT_DISPLAY預設螢幕來說,其一般擁有兩個ActivityStack:其一為此處建立的HomeStack,主要負責管理Launcher中的安卓桌面和SystemUI中的最近任務清單;另一個就是管理其他應用Activity的NormalStack。這兩種Stack及其内容我們可以通過指令dumpsys activity activities檢視。

HomeStack與NormalStack本質上都是ActivityStack,此處是基于其功能上的不同才将這兩種ActivityStack分别命名。

安卓系統啟動後首先顯示的是存放于HomeStack的安卓桌面Launcher,是以ASS在啟動時就會将HomeStack初始化,并将其記錄為焦點Stack。

​​​​​​​4.4 ActivityStackSupervison

ActivityStackSupervisor 用于管理ActivityStack;ActivityStackSupervisor為AMS提供管理方法;管理着系統中的三個ActivityStack;

ActivityStack mHomeStack //桌面的stack

ActivityStack mFocusedStack //目前聚焦stack

ActivityStack mLastFocusedStack //正在切換

AMS使用mHomeStack,mFocusedStack來完成系統全部的Activity的管理和排程。其中mHomeStack管理的是Launcher相關的任務,包括Launcher、RecentTask,Keyguad,除了上述以外的任務都歸mFocusedStack管理。

AMS 通過操作ActivityStackSupervisor來管理Activity;具體是如何操作的呢?ActivityStackSupervisor通過ActivityContainer來管理ActivityStack(ActivityStack的構造方法隻有在ActivityContainer的構造方法中被調用),ActivityContainer關聯ActivityDisplay,ActivityDisplay将自己的mStacks指派給ActivityContainer的mStack;mStack.mStacks = activityDisplay.mStacks;

ActivityContainer在ActivitySupervisor的createStackOnDisplay中被初始化,createStackOnDisplay在setWindowManager或adjustStackFocus或restoreRecentTaskLocked中被調用;這裡說說從setWindowManager開始的調用流程,setWindowManager在SystemServer啟動AMS時調用,然後調用ActivityContainer.attachToDisplayLocked方法;流程的大概就是根據mDisplayId擷取ActivityDisplay,将ActivityDisplay的mStacks(代表該Display上的所有activitystack) 指派給ActivityContainer的mStack的mStacks;同時将調用activityDisplay.attachActivities(mStack)将ActivityContainer的mStack(ActivityContainer維護的ActivityStack)添加到ActivityDisplay的mStacks 中;