本文用于记录AMS的相关知识总结。
AMS(ActivityManagerService)主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作。
1. Activity的启动
在我们平常的调用中,我们在Activity中调用startActivity(Intent intent)
,实际调用的代码的层次是Activity → Instrumentation → ActivityManager → IActivityManager (AMS)
,Instrumentation作为一个中转站,或者是切入面,来通知AMS去实现对应的功能。
① Activity
这个没啥好说的,Activity的启动函数。需要注意的是,实际上的启动过程跳转到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() 对象调用方法时,实际上已经在做跨进程通信,由 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 服务
// IActivityManager 是 binder 代理
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
App 的启动过程
① 调用 startActivity() 时,实际会走到 Instrumentation,由它与 AMS 通信
Instrumentation 会找 ServiceManager 获取 AMS(实际是获取 binder 代理)调用 startActivity()。在 9.0 之前是获取 AMS,9.0 之后是获取 ATMS。
② AMS 找到 PMS 获取启动的 Activity 信息。
③ 然后判断需要启动的 Activity 所在进程是否已存在,不存在 AMS 通过 socket 通知 Zygote fork 进程,然后反射调用 ActivityThread 的 main(),创建 Instrumentation、Application 和 Activity 以及走生命周期流程。
网友评论