一篇文章瞭解ActivityManagerService
1.1 Activity啓動過程看AMS
在閱讀Android源碼時,我們總會看到很多關於AMS相關的代碼,那麼AMS到底是什麼呢?一個服務?還是隻是單單具象的一個類?接下來我們從Activity啓動過程看下AMS到底起到什麼作用。
1.1.0 Android 28 AMS家族
在Activity的啓動過程中會調用到AMS
Instrumentation
描述: 實現應用程序檢測代碼的基類。運行時打開檢測,這個類將爲您實例化在任何應用程序代碼之前,允許您監視所有的系統與應用程序的交互。
在Activity的啓動過程中會調用 Instrumentation的execStartActivity方法,
執行應用程序發出的startActivity調用。默認的實現負責更新任何活動
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
Uri referrer = target != null ? target.onProvideReferrer() : null;
if (referrer != null) {
intent.putExtra(Intent.EXTRA_REFERRER, referrer);
}
……
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
return null;
}
繼續看下 ActivityManager.getService()
ActivityManager
我們可以看到getService方法調用了 IActivityManagerSingleton 的get()方法,IActivityManagerSingleton是一個單例。在註釋1處得到IBinder類型的AMS的引用,在註釋2處將它轉換成IActivityManager類型,這段代碼採用的是AIDL,主要實現進程間通信,服務器端也就是AMS只需要繼承IActivityManagerStub類並實現相應的方法就可以了。因此 上一段話的execStartActivity實際調用的就是AMS的execStartActivity方法。
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);//1
final IActivityManager am = IActivityManager.Stub.asInterface(b);//2
return am;
}
};
1.1.1 小結
ActivityManager的getService方法會得到IActivityManager,AMS只需要繼承IActivityManager.Stub類,就可以和ActivityManager實現進程間通信了。
參考:劉望舒《Android進階解密》