Activity启动流程学习笔记

这个只是本人的一些临时记录,大家可以不用查阅 如果想要学习,我推荐Android进阶——Android四大组件启动机制之Activity启动过程 这篇文章

这里写图片描述

首先会从Activity.StartActivity中调用startActivityForResult方法startActivityForResult内部会通过Instrumentation(仪器)这个工具类。去调用mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);这个方法,这个方法内部开始就是具体部分了。方法内部会调用 

int result = ActivityManagerNative.getDefault()
            .startActivity(whoThread, who.getBasePackageName(), intent,
                    intent.resolveTypeIfNeeded(who.getContentResolver()),
                    token, target != null ? target.mEmbeddedID : null,
                    requestCode, 0, null, options);
        ... ActivityManagerNative.getDefault()。调用ActivityManager本地代理对象ActivityManagerProxy通知启动Activity组件,一旦有Proxy代理对象,那么在源码中就会开始一波AIDL操作,都是有关Binder的跨进程操作,这个里面就很明显了,就是要通知ActivityManagerService来启动Activity在这个方法里面 我就不多赘述,传递的都是一些相应的参数,AIDL其实就是传值!远程串子,回调通信,onTransact()回调则会去调用ActivityManagerService.startActivity(),而且这个方法会调用startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
        resultWho, requestCode, startFlags, profilerInfo, options,
        UserHandle.getCallingUserId());

这个方法有返回值是int类型。他的内部会执行

mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent,
                 resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,
                 profilerInfo, null, null, options, false, userId, null, null);
   这个方法mStackSupervisor是咱们负责管理多个ActivityStack的,那么他出现的意义就是下一步可能要创建或者调用ActivityStack了。我们进一步跟进发现这个方法里面是参数设置、常规检查、权限检查、AppSwitch,主要就是检查和权限检查。不通过的话ActivityOptions.abort(options); 调用这个方法会直接中断启动。如果通过检测,

  1. Activity各种启动参数(Launcher Mode和Launcher Flag)的组合修正
  2. 处理目标Activity已经启动过的场景,只需要把其找出来,重新挪到前台显示即可
  3. 处理目标Activity不存在的场景,即该Activity没有被启动过,或者启动过后已经销毁的场景

调用ActivityStackSupervisor.startActivityUncheckedLocked 这里面设置了一系列的标志和状态,以及如何启动Activity最后调用了

targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);这个方法,准备开始创建Activity,targetStack就是ActivityStack我们Activity的任务栈了。在这个方法内部,会创建ActivityRecord并且判断要不要放入栈顶之类的操作以及如果调用的是已有的ActivityRecord的操作方法

mWindowManager.addAppToken(task.mActivities.indexOf(r), r.appToken,
                r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,
                (r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0, r.userId,
                r.info.configChanges, task.voiceSession != null, r.mLaunchTaskBehind);
           这个是绑定窗口的方法   ----------然后我们会调用

mStackSupervisor.resumeTopActivitiesLocked(this, r, options);方法,这个方法看起来就是为了设置栈顶Activity创建,并且遍历其他Activity状态用的。内部会有

targetStack.resumeTopActivityLocked(target, targetOptions);这样一个方法,这个就是ActivityStack任务栈设置栈顶Activity的方法。 这个方法里面主要是设置参数,然后调用

resumeTopActivityInnerLocked(prev, options); 这个方法,是对Activity的调度,也就是说,在什么情况下,可以启动,什么情况下不可以启动,或者暂停或者等待之类的,或者直接启动。如果没有宿主那么会调用

mStackSupervisor.startSpecificActivityLocked(next, true, true);主要作用:如果宿主进程不存在,则创建新的进程并且创建真正的Activity  

 

realStartActivityLocked(r, app, andResume, checkConfig); 这个方法内部就是开始创建真正的Activity了,设置Activity的任务,进程等级,以及启动

 app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
                new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage,
                task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
                newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo); ok到了关键部分了。app.thread是ApplicationThreadProxy 又是一轮AILD操作那么肯定调用的是底层了, 既然都是ApplicationThreadProxy 调用了,那么肯定调用的是ApplicationThread了ApplicationThread是和ActivityManagerService通讯用的,onTransact()回调则会去调用    

                ApplicationThread.scheduleLaunchActivity() 这个方法开始真正的设置Activity内部自己的参数了也就是ActivityRecord,并且通过handler发送 消息调用

ActivityThread.handleLaunchActivity(r, null);方法,在这个方法里面有着activity的生命周期中的方法回调。onCreate 方法在

ActivityThread.performLaunchActivity(r, customIntent);中调用,这个也是必须首先调用的生命周期!因为需要在onCreate的之前初始化Application对象。


               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值