Activity的启动流程

 我来答
黑科技1718
2022-06-15 · TA获得超过5835个赞
知道小有建树答主
回答量:433
采纳率:97%
帮助的人:80.3万
展开全部

相关源码:

调用 startActivity 或 startActivityForResult 来启动Activity。那么启动的Activity有两种情况:第一种是启动同进程内的Activity; 第二种是启动不同进程的根Activity,比如在桌面点击启动App,就是启动不同进程的Activity。这两种情况的Activity的启动流程大致相同,其流程大致是以下三个过程:

以下逐一讲解这三大过程:

下图是调用进程向system_server进程发起请求的过程:

startActivityForResult方法继续调用 Instrumentation.execStartActivity 方法。而Instrumentation类主要用来监控应用程序和系统的交互。

下图是ATMS处理startActivity过程,并回调启动进程的ApplicationThread

ATMS. startActivity:

ATMS类通过一系列方法调用最终来到 startActivityAsUser 的方法,该方法先检查调用进程的权限,然后通过 getActivityStartController().obtainStarter 创建 ActivityStarter 类,并把参数设置到 ActivityStarter.Request 类中,最后执行 ActivityStarter.execute() 方法。

ActivityStarter准备堆栈

在 ActivityStarter. executeRequest 方法中先做一系列的检查,包括调用进程的检查、Intent的检查、权限的检查、向PKMS获取启动Activity的ActivityInfo等信息,然后调用 startActivityUnchecked 方法开始对要启动的Activity做堆栈管理。

在 startActivityInner 方法中,根据启动模式计算出flag,在根据flag等条件启动的Activity的ActivityRecord是加入现有的Task栈中,还是创建新Task栈。为Activity准备好堆栈后,调用 RootWindowContainer.resumeFocusedStacksTopActivities 方法

ActivityStack对栈的管理:

对于启动Activity对应的 ActivityStack 来说,是管理其栈中Activity的显示逻辑。而后继续调用 ActivityStackSupervisor.startSpecificActivity

ActivityStackSupervisor检查启动进程和回调ApplicationThread

在ActivityStackSupervisor中先检查要启动Activity的进程是否存在,不存在则创建进程,存在则调用 realStartActivityLocked ,realStartActivityLocked方法通过事务给回调 ApplicationThread. scheduleTransaction 方法。

下图为ActivityThread启动Activity过程的时序图:

ApplicationThread类绕了一大圈,最后调用在ATMS阶段设置的ClientTransaction的CallBack的execute方法,也就是 LaunchActivityItem. execute 方法,此方法创建一个 ActivityClientRecord 对象,然后调用 ActivityThread. handleLaunchActivity 开启真正的Actvity启动。

真正启动Activity:

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

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式