总结activity启动过程中View,ViewRootImpl关系

近段时间查看android的布局流程一块代码时间较多,发现频繁使用到一个类ViewRootImpl,加之曾经有仔细分析过activity启动过程,和activity的setContentView之后的显示过程,但是一直没有作为一个整体连贯起来,后来在分析布局流程中,发现诸多疑惑比如:

  1. ViewRootImpl是怎样跟布局中的所有子View关联起来的
  2. 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) {
        ......
  
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值