Android Activity启动上层、底层简单总结
Activity.startActivityForResult中Instrumentation.execStartActivity
调用AMS.startActivity
会调用到Activity.resumeTopActivityUncheckedLocked
会调用到ASS.startSpecificActivityLocked
会调用到ASS.realStartActivityLocked中的关键代码
app.thread.scheduleLaunchActivity(newIntent(r.intent), r.appToken,
System.identityHashCode(r), r.info,
// TODO: Have this take the merged configuration instead of separateglobal and
// override configs.
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, !andResume,
mService.isNextTransitionForward(), profilerInfo);
app.thread的实现者是ApplicationThread
发送H.LAUNCH_ACTIVITY,record
消息处理中会调用到handleLaunchActivity,如下
Activity a = performLaunchActivity(r,customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
reportSizeConfigurations(r);
Bundle oldState = r.state;
handleResumeActivity(r.token, false, r.isForward,
performLaunchActivity完成了5件事
1. ActivityClientRecord中获取Activity信息
2. Instrumentation.newActivity使用类加载器创建Activity
3.Loadapk.makeApplication中通过Instrumentation创建Application对象并onCreate
4.创建ContextImpl对象并通过Activity.attach进行重要数据初始化,建立关联,还创建Window也建立关联。
5. Instrumentation调用onCreate
底层
总结:
1.运行在调用者所在进程,如果是从桌面进入,那么调用者进程就是launcher,launcher利用ActivityManagerProxy作为Binder client,进入system_server进程(AMS所在进程)。
2.会调用到resolveActivity(),借助PackageManager来查询系统中所有符合要求的Activity,当存在多个满足条件的Activity,会弹窗,让用户来选择。
3.创建ActivityRecord对象,并检查是否需要App切换,然后再处理mPendingActivityLaunches中的Activity。
4.为Activity找到或者创建新的Task对象,设置flags信息。
5.当没有处于非finishing状态的Activity,直接回到桌面;否则,当mResumedActivity不为空时,则暂停该Activity
6.如果进程不存在,需要创建进程。
7.system_server进程利用ATP(Binder client),通过Binder,进入目标进程
8.运行在目标进程,通过Handler,该进程中的Binder线程向主线程发送H.LAUNCH_ACTIVITY,最终通过反射创建Activity,进入生命周期。