近段时间查看android的布局流程一块代码时间较多,发现频繁使用到一个类ViewRootImpl,加之曾经有仔细分析过activity启动过程,和activity的setContentView之后的显示过程,但是一直没有作为一个整体连贯起来,后来在分析布局流程中,发现诸多疑惑比如:
- ViewRootImpl是怎样跟布局中的所有子View关联起来的
- View中的mAttachInfo什么时候初始化的,作用是什么
这里从activity的启动到调用oncreate中的setContentView再到ActivityThread中的handleResumeActivity分为三个大的流程进行分析。
1、activity的启动过程
activity的启动过程可以参见下图:
activit的启动过程及其复杂,这里只是抽取其中部分流程做讲解,暂时不对其细节做分析,比如其堆栈操作,启动模式各种参数之类的。
这里列出下回调到ActivityThread中的代码:
ActivityStackSupervisor类realStartActivityLocked方法中如下:
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
r.appToken);
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
// TODO: Have this take the merged configuration instead of separate global
// and override configs.
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, mService.isNextTransitionForward(),
profilerInfo));
// Set desired final state.
final ActivityLifecycleItem lifecycleItem;
if (andResume) {
lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
} else {
lifecycleItem = PauseActivityItem.obtain();
}
clientTransaction.setLifecycleStateRequest(lifecycleItem);
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
这里通过ClientTransaction添加LaunchActivityItem的回调和设置ResumeActivityItem为生命周期状态请求,先后回调了Activitythread中的handleLaunchActivity方法与handleResumeActivity方法。
TransactionExecutor.java
public void execute(ClientTransaction transaction) {
final IBinder token = transaction.getActivityToken();
log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);
executeCallbacks(transaction);
executeLifecycleState(transaction);
mPendingActions.clear();
log("End resolving transaction");
}
public void executeCallbacks(ClientTransaction transaction) {
......
item.execute(mTransactionHandler, token, mPendingActions);
item.postExecute(mTransactionHandler, token, mPendingActions);
......
}
private void executeLifecycleState(ClientTransaction transaction) {
......