Android 系列:Activity

442 阅读2分钟

1.Activity启动流程

1.1 Activity -> AMS

 public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        if (mParent == null) {
            options = transferSpringboardActivityOptions(options);
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
          
}    


Instrumentation#execStartActivity

  public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
                IApplicationThread whoThread = (IApplicationThread) contextThread;
                //拿到AMS的代理类,这里有IPC
             int result = ActivityManager.getService()
                 .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
            //检验启动后的结果,比如该Activity是否在Activity里面注册了
            checkStartActivityResult(result, intent);
            }

经过上面的两步后,启动的任务交给了AMS

1.2 AMS -> ActivityThread

这里假设应用进程已经启动, 在AMS经过一系列参数传递后,最终会调用到ActivityStackSupervisor

    void startSpecificActivityLocked(ActivityRecord r,
            boolean andResume, boolean checkConfig) {
        // Is this activity's application already running?
        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
                r.info.applicationInfo.uid, true);

        r.getStack().setLaunchTime(r);
        // 需要启动的Activity所在进程存在,并且ApplicationThread准备就绪
        if (app != null && app.thread != null) {
            try {
                //启动Activity
                realStartActivityLocked(r, app, andResume, checkConfig);
                return;
            } catch (RemoteException e) {

            }

        }
        //如果进程不存在,去调用AMS的startProcessLocked 去创建进程,再启动Activity
        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
                "activity", r.intent.getComponent(), false, false, true);
                
        
    }
 final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
            //IPC 调用ApplicationThread的方法
            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                        System.identityHashCode(r));
            }

从上面可以看出,不管是Activity到AMS,还是AMS到ActivityThread,都是用了IPC机制,并且都是使用ApplicationThread来沟通App进程和AMS所在的SystemServer进程,也就是说==ApplicationThread是APP进程和SystemServer进行IPC的桥梁==

接下来就是在ActivityThread中进行Activity的启动了

1.3 冷启动

如果应用程序进程没有被创建,我们就要去创建,创建完毕后,ActivityThread会向AMS汇报 请求创建Application,Application创建完毕后,再启动根Activity

private final boolean attachApplicationLocked(IApplicationThread thread,
            int pid) {
            //创建Application
                 thread.bindApplication();
            // 再去启动Activity
            realStartActivityLocked(activity, app,top == activity /* andResume */, true /*)
            }

1.3 ActivityThread -> Activity(onCreate)

 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    //创建context
     ContextImpl appContext = createBaseContextForActivity(r);
    //new Activity
     java.lang.ClassLoader cl = appContext.getClassLoader();
     activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
    
    //直接去拿Application信息,这里不需要再次创建,因为application已经创建完毕了
    Application app = r.packageInfo.makeApplication(false, mInstrumentation);
    
    //
    activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window, r.configCallback);
 }
 //将context 赋予给父类的mBase 
  final void attach(Context context, ActivityThread aThread,
            Instrumentation instr) {
            
        attachBaseContext(context);
        }

小结:

  • 创建Activity对象
  • 准备好Application
  • 创建context
  • attach上下文
  • 生命周期回调