Activity的启动流程这一篇够了

 我来答
温屿17
2022-07-22 · TA获得超过1.2万个赞
知道小有建树答主
回答量:827
采纳率:0%
帮助的人:95.2万
展开全部

来了小伙子,先自我介绍一下吧

什么?你精通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也就正式启动了,后续就是对应的声明周期回调。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式