这个只是本人的一些临时记录,大家可以不用查阅 如果想要学习,我推荐Android进阶——Android四大组件启动机制之Activity启动过程 这篇文章
首先会从Activity.StartActivity中调用startActivityForResult方法startActivityForResult内部会通过Instrumentation(仪器)这个工具类。去调用mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);这个方法,这个方法内部开始就是具体部分了。方法内部会调用
int result = ActivityManagerNative.getDefault()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
... ActivityManagerNative.getDefault()。调用ActivityManager本地代理对象ActivityManagerProxy通知启动Activity组件,一旦有Proxy代理对象,那么在源码中就会开始一波AIDL操作,都是有关Binder的跨进程操作,这个里面就很明显了,就是要通知ActivityManagerService来启动Activity在这个方法里面 我就不多赘述,传递的都是一些相应的参数,AIDL其实就是传值!远程串子,回调通信,onTransact()回调则会去调用ActivityManagerService.startActivity(),而且这个方法会调用startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
resultWho, requestCode, startFlags, profilerInfo, options,
UserHandle.getCallingUserId());
这个方法有返回值是int类型。他的内部会执行
mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent,
resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
profilerInfo, null, null, options, false, userId, null, null);
这个方法mStackSupervisor是咱们负责管理多个ActivityStack的,那么他出现的意义就是下一步可能要创建或者调用ActivityStack了。我们进一步跟进发现这个方法里面是参数设置、常规检查、权限检查、AppSwitch,主要就是检查和权限检查。不通过的话ActivityOptions.abort(options); 调用这个方法会直接中断启动。如果通过检测,
- Activity各种启动参数(Launcher Mode和Launcher Flag)的组合修正
- 处理目标Activity已经启动过的场景,只需要把其找出来,重新挪到前台显示即可
- 处理目标Activity不存在的场景,即该Activity没有被启动过,或者启动过后已经销毁的场景
调用ActivityStackSupervisor.startActivityUncheckedLocked 这里面设置了一系列的标志和状态,以及如何启动Activity最后调用了
targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);这个方法,准备开始创建Activity,targetStack就是ActivityStack我们Activity的任务栈了。在这个方法内部,会创建ActivityRecord并且判断要不要放入栈顶之类的操作以及如果调用的是已有的ActivityRecord的操作方法
mWindowManager.addAppToken(task.mActivities.indexOf(r), r.appToken,
r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,
(r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0, r.userId,
r.info.configChanges, task.voiceSession != null, r.mLaunchTaskBehind);
这个是绑定窗口的方法 ----------然后我们会调用
mStackSupervisor.resumeTopActivitiesLocked(this, r, options);方法,这个方法看起来就是为了设置栈顶Activity创建,并且遍历其他Activity状态用的。内部会有
targetStack.resumeTopActivityLocked(target, targetOptions);这样一个方法,这个就是ActivityStack任务栈设置栈顶Activity的方法。 这个方法里面主要是设置参数,然后调用
resumeTopActivityInnerLocked(prev, options); 这个方法,是对Activity的调度,也就是说,在什么情况下,可以启动,什么情况下不可以启动,或者暂停或者等待之类的,或者直接启动。如果没有宿主那么会调用
mStackSupervisor.startSpecificActivityLocked(next, true, true);主要作用:如果宿主进程不存在,则创建新的进程并且创建真正的Activity
realStartActivityLocked(r, app, andResume, checkConfig); 这个方法内部就是开始创建真正的Activity了,设置Activity的任务,进程等级,以及启动
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage,
task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
ok到了关键部分了。app.thread是ApplicationThreadProxy 又是一轮AILD操作那么肯定调用的是底层了, 既然都是ApplicationThreadProxy 调用了,那么肯定调用的是ApplicationThread了ApplicationThread是和ActivityManagerService通讯用的,onTransact()回调则会去调用
ApplicationThread.scheduleLaunchActivity() 这个方法开始真正的设置Activity内部自己的参数了也就是ActivityRecord,并且通过handler发送 消息调用
ActivityThread.handleLaunchActivity(r, null);方法,在这个方法里面有着activity的生命周期中的方法回调。onCreate 方法在
ActivityThread.performLaunchActivity(r, customIntent);中调用,这个也是必须首先调用的生命周期!因为需要在onCreate的之前初始化Application对象。