四大组件之 Activity 启动流程
想要启动应用的 Activity 首先得要保证该应用的进程已经启动。
Launcher 发起
即当用户点击桌面上的应用图标时,实际就是调用了 Launcher 的 startActivitySafely 方法。该方法主要作用就是设置将要启动的 Activity 的启动方式 Intent.FLAG_ACTIVITY_NEW_TASK。
转至 Instrumentation
Instrumentation 类的作用是帮我们关注着系统与应用的交互。接下来就会通过 Instrumentation 对象调用 execStartActivity 方法。在这个方法中会去获取 AMS 的代理对象,通过代理来执行 AMS 中的方法。
public ActivityResult execStartActivity(Context who, IBinder contextThread,
IBinder token, Activity target,Intent intent, int requestCode, Bundle options) {
//省略...
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
//通过这步可知调用的是 AMS 的 startActivity 方法
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
checkStartActivityResult(result, intent);
} catch() {
//省略...
}
//省略...
}
这样一来启动 Activity 的响应就从用户点击到了 AMS 这里了,我们继续往下。
AMS 的 startActivity
AMS 的 startActivity 方法其实并没有做什么,而是调用了 startActivityAsUser 主要做了用户权限的判断,看看是否可以正常调用继续往下走。
转至 ActivityStarter
权限校验通过后,接着会调用 ActivityStarter 对象的 startActivityMayWait 和 startActivityLocked 方法。关于 ActivityStarter,类注释是这么说的,指明怎样及何时启动 Activity,是一个控制器类。那么大致思路是经过它 Activity 就确定了启动参数以及启动时机。
ActivityStackSupervisor 和 ActivityStack
经过几层调用后,就会来到 ActivityStackSupervisor,并调用 ActivityStackSupervisor 对象的 resumeFocusedStackTopActivityLocked 方法,中间再通过 ActivityStack 对象方法的调用,最终又回到 ActivityStackSupervisor 中,调用 startSpecificActivityLocked 方法。
void startSpecificActivityLocked(ActivityRecord r,boolean andResume,
boolean checkConfig) {
// Is this activity's application already running?
//这句很关键,通过 AMS 判断应用程序进程是否已就绪
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid, true);
//省略...
if (app != null && app.thread != null) {
//省略...
//这里接下去就会跳转到应用程序进程中执行 Activity 的启动
realStartActivityLocked(r, app, andResume, checkConfig);
return;
//省略...
}
//这里熟悉吗?不就是我们之前在看启动应用程序进程的入口么
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}
到这里,AMS 的使命差不多就完成了,接下去就要交给应用程序进程来处理了。
ActivityThread
前面说到,realStartActivityLocked 方法内会切换到应用程序进程,其实就是切到了 ActivityThread 里。在 ActivityThread 会通过 H 类来进行发送消息处理,通过处理 LAUNCH_ACTIVITY 消息最终一步步的就调到了 Activity 类的 onCreate 方法,也就是我们平时说的 Activity 生命周期的第一个方法。
网友评论