Android进阶3:Activity源码分析(2) —— Activity启动和销毁流程(8.0)

上篇文章讲述了app从启动创建Activity调用onCreate,onStart, onResume方法,这篇文章讲述一下Activity启动的另一个切入点:startActivity方法,启动Activity。

Android进阶3:Activity源码分析(1) —— Activity启动流程(8.0)

通过上一篇文章,我们总结一下:
1:ActivityThread是通过Instrumentation调度Activity的生命周期的
2:ApplicationThread继承自IApplicationThread.Stub,本身就是一个Binder对象。AMS给ActivityThread传递信息,就是通过Binder机制,也就是ApplicationThread传递的。
3:Instrumentation内部提供了创建Activity,调用Activity的方法,创建Application,调用Application的方法,至少从我们上一篇文章得到的结论是:Instrumentation好比一个管家,管理着Activity和Application的生命周期。

接下来是一些小知识点:
1:我们之前说的UI主线程初始化Looper是在ActivityThread中的main方法中,这就是为什么我们可以在UI层直接发送使用Handler机制。
2:项目开发中总是在Application的onCreate中,做一些初始化操作,因为Application的创建的比Activity创建更早,并且Application 的onCreate方法调用的更早。

好了,开始分析另一个切入点:Activity的startActivity(…)

Activity启动:startActivity()

先看下Activity的startActivity源码:

    @Override
    public void startActivity(Intent intent) {
        this.startActivity(intent, null);
    }
    //Bundle : 传递的数据
    @Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        //不需要返回数据,requestCode默认:-1
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            startActivityForResult(intent, -1);
        }
    }
    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
        startActivityForResult(intent, requestCode, null);
    }

        public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        if (mParent == null) {
            //requestCode = -1
            options = transferSpringboardActivityOptions(options);
            //调用Instrumentation的execStartActivity方法;
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);


            ......
       }

通过上述代码可以看到:startActivity其实最终调用的都是startActivityForResult,如果不需要返回值,requestCode传递-1, 此时调用Instrumentation的execStartActivity方法。

   public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {

        .....

        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            /*
            ActivityManager.getService().startActivity()就是IActivityManager的代理对象调用了startActivity方法,通过binder机制,
            从而调用ActivityManagerService的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 (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

再调用AMS的startActivity方法,Binder机制

        @Override
        public int startActivity(IBinder whoThread, String callingPackage,
                Intent intent, String resolvedType, Bundle bOptions) {
            .......
            return mActivityStarter.startActivityMayWait(appThread, -1, callingPackage, intent,
                    resolvedType, null, null, null, null, 0, 0, null, null,
                    null, bOptions, false, callingUser, null, tr, "AppTaskImpl");
        }

进入:startActivityMayWait


    final int startActivityMayWait(IApplicationThread caller, int callingUid,
            String callingPackage, Intent intent, String resolvedType,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            IBinder resultTo, String resultWho, int requestCode, int startFlags,
            ProfilerInfo profilerInfo, WaitResult outResult,
            Configuration globalConfig, Bundle bOptions, boolean ignoreTargetSecurity, int userId,
            IActivityContainer iContainer, TaskRecord i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值