本文用于記錄AMS的相關(guān)知識總結(jié)。
AMS(ActivityManagerService)主要負責(zé)系統(tǒng)中四大組件的啟動、切換、調(diào)度及應(yīng)用進程的管理和調(diào)度等工作。
1. Activity的啟動
在我們平常的調(diào)用中,我們在Activity中調(diào)用startActivity(Intent intent),實際調(diào)用的代碼的層次是Activity → Instrumentation → ActivityManager → IActivityManager (AMS),Instrumentation作為一個中轉(zhuǎn)站,或者是切入面,來通知AMS去實現(xiàn)對應(yīng)的功能。
① Activity
這個沒啥好說的,Activity的啟動函數(shù)。需要注意的是,實際上的啟動過程跳轉(zhuǎn)到mInstrumentation,也就是Instrumentation類中。
@Override
public void startActivity(Intent intent) {
this.startActivity(intent, null);
}
@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
// Note we want to go through this call for compatibility with
// applications that may have overridden the method.
startActivityForResult(intent, -1);
}
}
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) {
...
// 委托給 Instrumentation
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
....
}
...
}
② Instrumentation
Instrumentation的啟動是交給ActivityManager.getService(),實際上也就是AMS了。
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
...
try {
...
// 找到 AMS 告知要啟動 Activity
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
...
}
...
}
③ ActivityManager
ActivityManager.getService() 會獲取 IActivityManager,它是一個 binder 代理對象。從代碼可以看出,當使用 ActivityManager.getService() 對象調(diào)用方法時,實際上已經(jīng)在做跨進程通信,由 binder 代理對象和 AMS 通信,通信所在的進程是 system_server。
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
// 通過 ServiceManager 獲取 AMS 服務(wù)
// IActivityManager 是 binder 代理
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
App 的啟動過程
① 調(diào)用 startActivity() 時,實際會走到 Instrumentation,由它與 AMS 通信
Instrumentation 會找 ServiceManager 獲取 AMS(實際是獲取 binder 代理)調(diào)用 startActivity()。在 9.0 之前是獲取 AMS,9.0 之后是獲取 ATMS。
② AMS 找到 PMS 獲取啟動的 Activity 信息。
③ 然后判斷需要啟動的 Activity 所在進程是否已存在,不存在 AMS 通過 socket 通知 Zygote fork 進程,然后反射調(diào)用 ActivityThread 的 main(),創(chuàng)建 Instrumentation、Application 和 Activity 以及走生命周期流程。