启动一个Activity,通常有两种情况:第一种是不同进程的的根activity,比如laucnher启动app;第二种是同进程内部启动activity。这两种情况的启动流程类似,大致分为以下三个步骤:

  1. 调用进程的activity收集好信息后,向system_server进程的ActivityTaskManagerSrvice服务发起请求。
  2. ATMS向PKMS寻找启动的activity的信息和进程信息,如果启动的activity没有被创建,则创建新进程,之后管理activity栈,并回调启动activity所在进程的ApplicationThread类。
  3. 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中声明。