启动一个Activity,通常有两种情况:第一种是不同进程的的根activity,比如laucnher启动app;第二种是同进程内部启动activity。这两种情况的启动流程类似,大致分为以下三个步骤:
- 调用进程的activity收集好信息后,向system_server进程的ActivityTaskManagerSrvice服务发起请求。
- ATMS向PKMS寻找启动的activity的信息和进程信息,如果启动的activity没有被创建,则创建新进程,之后管理activity栈,并回调启动activity所在进程的ApplicationThread类。
- ApplicationThread通过调用ActivityThread来反射创建并启动Activity。
以下就逐一讲解这三大过程:
一、从startActivity到ATMS
无论是startActivity
还是startActivityForResult
最终都是调用startActivityForResult
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback,
AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient {
@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) {
// mParent 是Activity类型,是当前Activity的父类
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
// 调用Instrumentation.execStartActivity启动activity
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
...
} else {
...
}
}
}
startActivityForResult
中继续调用Instrumentation.execStartActivity
方法。Activity中的mInstrumentation
是在attach()
方法中初始化,由ActivityThread
传入,其作用一是通过远程服务调用启动activity;二是连接ActivityThread与activity,处理activity生命周期回调。
ActivityTaskManager.getService()
获取ATMS的代理类,通过Binder跨进程通信,向ATMS发起startActivity请求。- 向ATMS发起启动activity请求,获得启动结果result,根据result判断能否启动activity,不能则抛出异常,比如activity未在manifest中声明。