Activity的启动流程这一篇够了
来了小伙子,先自我介绍一下吧
什么?你精通Android系统?来,你给我说下Activity的启动流程。
Activity的启动过程是系统中比较有代表意义的过程,涉及到了各个进程之间的相互交互,以及生命周期的回调控制,这也是为什么在面试过程出现频率这么高的原因之一。
Activity的启动流程在API28以后变成了事务启动的方式,相比之前版本的逻辑有了一些变化,但是万变不离其宗,大致流程还是类似的,只是增加了一些类,用来更好的划分职责,更优的处理逻辑。
在开始之前,我们先简单普及下基础知识。
我们都知道进程与进程之间是数据隔离的,无法相互访问数据,所以进程之间通信是靠Binder来完成的。
面试官可能会问你 为什么会用Binder通信,Binder相比Socket有什么优势呢?
然而果然被追问了 为啥Binder能做到1次拷贝,而其他的技术是2次拷贝
好,可以描述下具体的映射怎么做的么?....
我们以 点击Launcher的一个icon 为开始,整体扯一下Activity的启动过程,桌面其实就是LauncherApp的一个Activity
最终调用performLaunchActivity方法创建activity和context并将其做关联,然后通过mInstrumentation.callActivityOnCreate()->Activity.performCreate()->Activity.onCreate()回调到了Activity的生命周期。
启动一个Activity一般通过startActivity()
关于Android进阶、架构设计、NDK、跨平台、底层源码,KT,Flutter,以及面试的资料在我的Github上面可自行查看
项目地址: https://github.com/hunanmaniu/AndroidNotes
我们先看下正常启动Activity的方式,一般我们都会通过以下的方式启动一个新的Activity。
其实这是在Activity中的调用方式,调用的即是父类Activity的startActivity()方法,因参数不同分为两个方法,具体如下
最终调用的是startActivityForResult()
核心逻辑是调用了Instrumentation.execStartActivity()
ActivityManager.getService()这个获取的是谁? 逻辑是从IActivityManagerSingleton.get()获取,那IActivityManagerSingleton又是谁? IActivityManagerSingleton是这么定义的Singleton IActivityManagerSingleton get取出来的是IActivityManager,看这个大写I开头就知道是一个接口,实际调用过的是它的实现ActivityManagerService。 ActivityManagerService. startActivity()
mActivityStartController.obtainStarter实际调用的是ActivityStarter.execute(),连带调用到ActivityStarter.startActivity()
ActivityStarter.startActivityUnchecked()连带调用ActivityStackSupervisor.resumeFocusedStackTopActivityLocked();
targetStack为ActivityStack对象,ActivityStack.resumeTopActivityUncheckedLocked()
ActivityStack.resumeTopActivityInnerLocked()调用了mStackSupervisor.startSpecificActivityLocked(next, true, true);其中mStackSupervisor为ActivityStackSupervisor。 ActivityStackSupervisor.startSpecificActivityLocked()中调用 ActivityStackSupervisor.realStartActivityLocked()
注意这个clientTransaction对象,通过这种方式初始化
ClientLifecycleManager.scheduleTransaction(clientTransaction);
transaction.schedule();就要找到
mClient即是以上描述的ApplicationThread,因此我们跟进ApplicationThread.scheduleTransaction()
我靠,调用了ActivityThread.scheduleTransaction(transaction),但是ActivityThread并没有scheduleTransaction(),所以我们找他继承的类ClientTransactionHandler,发现ClientTransactionHandler果然有scheduleTransaction()
以上消息通过ActivityThread H对象进行发送具体解析也在ActivityThread中
我们可以看下TransactionExecutor.execute(transaction);
这里我们主要看下executeCallbacks()方法
transaction.getCallbacks()就是上述过程中ClientTransaction创建过程赋值的LaunchActivityItem对象,因此主要看下LaunchActivityItem.execute()
此时的client为ActivityThread,因此调用ActivityThread.handleLaunchActivity()
主要跟进mInstrumentation.callActivityOnCreate()
Activity.performCreate()
至此已经回调到了Activity的onCreate()方法,Activity也就正式启动了,后续就是对应的声明周期回调。