源码理解:Activity启动流程及一些细节

本文将分析activity的启动流程,把握主流程和一些疑难点及回调的触发时机。

源码分析

该部分内容较长,会梳理流程并分析部分重点函数,读者可选择阅读,也可直接跳至总结部分

无论何种形式的startActivity,最终都会调用到startActivityForResult,该函数有三个参数需要理解一下:
intent即将要启动的目标intent
requestCode如果该值>0则该值将会在下一个activity启动后的onActivityResult返回获得
bundle可为null为配置参数。

public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
        if (mParent == null) {//没有parent的情况
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            if (ar != null) {
                mMainThread.sendActivityResult(
                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                    ar.getResultData());
            }
            if (requestCode >= 0) {
                // 这里用来作为下一个activity的返回标记
                mStartedActivity = true;
            }

            final View decor = mWindow != null ? mWindow.peekDecorView() : null;
            if (decor != null) {
                decor.cancelPendingInputEvents();//用来取消输入事件传递,内部主要取消了onclick和longPress的回调
            }
            // TODO Consider clearing/flushing other event sources and events for child windows.
        } else {//有parent的情况,需要遍历子activity
            if (options != null) {
                mParent.startActivityFromChild(this, intent, requestCode, options);
            } else {
                mParent.startActivityFromChild(this, intent, requestCode);
            }
        }
        if (options != null && !isTopOfTask()) {//大部分情况不用考虑
            mActivityTransitionState.startExitOutTransition(this, options);
        }
    }

通过上述代码,我们不难看出,启动activity主要分为两个分支,判断条件就是mParent是否为null,那么mParent到底是什么,何时赋值的呢?我为读者梳理了activity源码并找出了这个对象的来由,首先在activity创建后回调onCreate前会先触发attach这个方法,该方法会给mParent赋值
在这里插入图片描述
该方法是在ActivityThread里performLaunchActivity调用

activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.voiceInteractor);

再继续跟踪会发现LocalActivityManager的moveToState是调用源头

r.activity = mActivityThread.startAct
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值