Activity启动流程总结

news/2025/2/5 11:43:58/文章来源:https://www.cnblogs.com/wnpp/p/18699037

1. 应用进程启动 Activity

当应用中的某个 Activity 调用 startActivity 方法时,实际上是通过 ContextImpl 类中的 startActivity 方法发起的。

java
深色版本
public class ContextImpl extends Context {@Overridepublic void startActivity(Intent intent) {// 调用 Instrumentation 的 startActivity 方法mInstrumentation.execStartActivity(getOuterContext(), mMainThread.getApplicationThread(), null,(Activity) null, intent, -1, null);}
}

2. 通过 Instrumentation 发起请求

ContextImpl 会调用 Instrumentation 类中的 execStartActivity 方法来处理启动请求。

java
深色版本
public class Instrumentation {public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {IApplicationThread appThread = (IApplicationThread) contextThread;// 通过 Binder 调用 AMS(ActivityTaskManagerService)int result = ActivityTaskManager.getService().startActivity(appThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options);return new ActivityResult(result, null);}
}

3. 跨进程通信到 ActivityTaskManagerService (ATMS)

startActivity 请求通过 Binder 机制传递给系统服务进程中的 ActivityTaskManagerService(ATMS)。ATMS 是运行在 SystemServer 进程中的一个服务,负责管理所有应用的 Activity 生命周期和任务栈。

ATMS 处理启动请求

在 ATMS 中,启动 Activity 的逻辑主要由 ActivityStarter 类处理。它会解析 Intent 并根据启动模式(如 singleTasksingleInstance 等)决定如何启动或复用 Activity

java
深色版本
public class ActivityStarter {public int startActivityMayWait(IApplicationThread caller, String callingPackage, Intent intent,
            String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int flags, ProfilerInfo profilerInfo, Bundle options) {// 解析 Intent 和启动模式TaskRecord task = findTaskForActivity(intent.getComponent());if (task != null && isSingleTaskMode(intent)) {// 如果任务栈已存在且是 singleTask 模式bringTaskToFront(task);return START_TASK_TO_FRONT;} else {// 创建新的任务栈并启动 ActivityTaskRecord newTask = createNewTask(intent);startNewActivity(newTask, intent);return START_SUCCESS;}}private boolean isSingleTaskMode(Intent intent) {// 判断是否是 singleTask 模式return intent.getComponent().getLaunchMode() == ActivityInfo.LAUNCH_SINGLE_TASK;}private TaskRecord findTaskForActivity(ComponentName componentName) {// 查找包含指定 Activity 的任务栈for (TaskRecord task : mTaskStacks) {if (task.containsActivity(componentName)) {return task;}}return null;}private void bringTaskToFront(TaskRecord task) {// 将任务栈置于前台,并清理位于目标 Activity 之上的所有 ActivitymoveTaskToFront(task);}private void moveTaskToFront(TaskRecord task) {// 将任务栈置于前台mTaskStacks.remove(task);mTaskStacks.add(task); // 或者使用特定的方法将任务栈置于前台}private TaskRecord createNewTask(Intent intent) {// 创建新的任务栈TaskRecord newTask = new TaskRecord();// 设置任务栈属性return newTask;}private void startNewActivity(TaskRecord task, Intent intent) {// 启动新的 Activity 并将其添加到任务栈中ActivityRecord activityRecord = new ActivityRecord(intent);task.addActivity(activityRecord);}
}

4. 通知客户端启动 Activity

一旦 ATMS 决定了如何启动或复用 Activity,它会通过 ApplicationThread 通知客户端应用启动新的 Activity。这个过程涉及到 Binder 调用,具体是通过 IApplicationThread 接口进行的。

java
深色版本
public interface IApplicationThread {void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
            ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
            String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,
            PersistableBundle persistentState, List<ResultInfo> pendingResults,
            List<ReferrerIntent> pendingNewIntents, boolean notResumed, boolean isForward,
            ProfilerInfo profilerInfo);
}

5. 客户端应用处理启动请求

在客户端应用进程中,ApplicationThread 实现了 IApplicationThread 接口,并且在收到 scheduleLaunchActivity 调用后,会将请求转发给 ActivityThreadhandleLauncherActivity 方法。

java
深色版本
public class ActivityThread {final ApplicationThread mAppThread = new ApplicationThread();private class ApplicationThread extends IApplicationThread.Stub {@Overridepublic void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
                String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,
                PersistableBundle persistentState, List<ResultInfo> pendingResults,
                List<ReferrerIntent> pendingNewIntents, boolean notResumed, boolean isForward,
                ProfilerInfo profilerInfo) {sendMessage(H.LAUNCH_ACTIVITY, new ActivityClientRecord(r, data));}}private void handleLauncherActivity(ActivityClientRecord r) {// 创建并启动 ActivityClientTransaction transaction = ClientTransaction.obtain(applicationThread, r.token);transaction.addCallback(LaunchActivityItem.obtain(r.intent, r.info,new Configuration(), r.compatInfo, r.referrer, r.voiceInteractor, windowIsFloating,r.config, r.overrideConfig, r.pendingResults, r.pendingNewIntents,mLastNonConfigurationInstances, r.isForward, profilerInfo));executeTransaction(transaction);}private void executeTransaction(ClientTransaction transaction) {// 执行事务,包括创建和启动 ActivityActivity activity = performLaunchActivity(transaction.getActivityClientRecord());if (activity != null) {performResumeActivity(transaction.getActivityClientRecord());}}private Activity performLaunchActivity(ActivityClientRecord r) {// 创建 Activity 实例Activity activity = null;try {java.lang.ClassLoader cl = appContext.getClassLoader();activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);...activity.attach(appContext, this, getInstrumentation(), r.token,r.ident, app, r.intent, r.activityInfo, title, r.parent,r.embeddedID, r.lastNonConfigurationInstances, config,r.referrer, r.voiceInteractor);...if (r.state != null || r.persistentState != null) {mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,r.persistentState);}activity.mCalled = false;mInstrumentation.callActivityOnCreate(activity, r.state);...return activity;} catch (Exception e) {...}}
}

关键点解释

  1. 跨进程通信

    • 客户端通过 Binder 调用 ActivityTaskManagerService(ATMS)的方法来启动 Activity
    • ATMS 处理任务栈和 ActivityRecord,决定如何启动或复用 Activity
  2. 任务栈管理

    • ActivityTaskManagerService 使用 ActivityStarter 类来解析 Intent 并根据启动模式决定如何启动或复用 Activity
    • 如果需要启动新的 Activity,则将其添加到适当的任务栈中;如果需要复用现有实例,则调整任务栈以确保该实例位于栈顶。
  3. 通知客户端

    • ActivityTaskManagerService 通过 ApplicationThread 通知客户端应用启动新的 Activity
    • ApplicationThread 实现了 IApplicationThread 接口,并在收到 scheduleLaunchActivity 调用后,将请求转发给 ActivityThreadhandleLauncherActivity 方法。
  4. 启动 Activity

    • 在客户端应用进程中,ActivityThreadhandleLauncherActivity 方法负责创建并启动 Activity 实例。
    • performLaunchActivity 方法用于创建 Activity 实例,并调用其生命周期方法(如 onCreateonStart 等)。

总结

以下是经过整理后的完整流程:

  1. 应用进程启动 Activity

    • 应用中的某个 Activity 调用 startActivity 方法,实际通过 ContextImpl 类中的 startActivity 方法发起请求。
  2. 通过 Instrumentation 发起请求

    • ContextImpl 调用 Instrumentation 类中的 execStartActivity 方法来处理启动请求。
  3. 跨进程通信到 ActivityTaskManagerService (ATMS)

    • startActivity 请求通过 Binder 机制传递给系统服务进程中的 ActivityTaskManagerService(ATMS)。
    • ATMS 解析 Intent 并根据启动模式决定如何启动或复用 Activity
  4. 通知客户端启动 Activity

    • ATMS 通过 ApplicationThread 通知客户端应用启动新的 Activity
    • ApplicationThread 实现了 IApplicationThread 接口,并在收到 scheduleLaunchActivity 调用后,将请求转发给 ActivityThreadhandleLauncherActivity 方法。
  5. 客户端应用处理启动请求

    • 在客户端应用进程中,ActivityThreadhandleLauncherActivity 方法负责创建并启动 Activity 实例。
    • performLaunchActivity 方法用于创建 Activity 实例,并调用其生命周期方法(如 onCreateonStart 等)。

通过这一系列步骤,Android 系统能够高效地管理和调度 Activity 的生命周期,确保应用的正常运行。希望这个详细的流程描述能帮助你更好地理解 Activity 启动的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879018.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

城市智慧升级:超算与智算的协同效应

随着数字化转型的不断深入,城市高质量发展越来越依赖于强大的算力支持。结合超级计算(超算)和智能计算(智算)的“超算+智算”模式,正在成为推动城市创新和智能化发展的重要力量。超算与智算的结合超级计算通常指的是使用最先进的计算机硬件和软件进行大规模科学计算的技术…

linux安装适用glibc2.17的nodejs高版本

从nodejs18开始需要的glibc版本要>2.28,这对有些系统是不支持的,除了官方的下载地址外,还有个地址可以下载适用2.17的nodejs高版本。 https://unofficial-builds.nodejs.org/download/release/ 对于linux平台直接下载解压使用即可。本帖子也是纯手工制作,转载请标明出处…

安卓苹果手机通用的便签备忘录APP哪个好用?

每次换手机最头疼的不是适应新系统,而是发现旧手机里800条备忘和灵感,全都困在品牌的生态孤岛里! 无论是小米换iPhone还是华为跳三星,系统自带的备忘录就像「前任的日记本」,永远无法在新欢身上打开。 这时候你就需要一款真正打破系统壁垒的「跨平台同步便签/备忘录APP」!…

市域治理“一网统管”:构建现代化城市治理新体系

随着信息技术的快速发展,城市治理面临着新的机遇与挑战。市域治理“一网统管”作为推动城市治理现代化的重要举措,正逐渐成为提升城市管理效率和服务质量的关键。本文将探讨市域治理“一网统管”的建设内容,旨在为构建更加智能、高效的城市治理体系提供参考。一网统管的内涵…

红米Note12TPro-小米14Ultra-Root记录

原文链接:https://tingxuanr.github.io/note/红米note12tpro-小米14ultra-root记录/#more 摘要:记录一下给红米note12t、红米note11t、小米14ultra的root过程。联发科芯片和骁龙芯片及不同安卓版本的root过程有差异。推荐用狐狸面具,隐藏root能过电信app和银行app的检测。红…

非物质文化遗产服务系统

在数字化时代,非物质文化遗产(以下简称“非遗”)的保护与传承面临着新的机遇与挑战。非遗不仅是一个国家和民族历史文化成就的重要标志,更是全人类的共同文化财富。随着现代化进程的加速,许多非遗技艺面临失传的危险,因此开发一套系统对其进行保护和传承显得尤为迫切。非…

城市扩张模拟与评价系统

随着全球城市化的加速推进,城市扩张已成为不可避免的趋势。然而,无序的城市扩张往往伴随着资源浪费、环境污染、交通拥堵等一系列问题。因此,建立一个科学、高效的城市扩张模拟与评价系统显得尤为重要。 一、系统建设的必要性城市扩张模拟与评价系统旨在通过模拟技术预测城市…

2025年热门项目管理软件大PK:5款最火工具,哪一款是你的首选?

在当今竞争激烈的商业环境中,高效的项目管理是企业成功的关键。随着数字化技术的飞速发展,项目管理软件如雨后春笋般涌现,为项目管理者提供了强大的支持。今天,我们将为大家揭秘 2025 年最热门的 10 款项目管理软件,它们各具特色,功能强大,究竟哪一款能成为你项目管理的…

springboot~http请求和响应的字段格式化

我们以日期类型为例,把它作为请求参数和响应字段进行说明,默认的日期字段格式为ISO 8601标准,DateTimeFormat.ISO.DATE_TIME,格式为yyyy-MM-ddTHH:mm:ss,与咱们常用的日期时间有所不同,所以咱们需要重新定义一下。 本文功能统一了日期参数,由传入的字符串传为java对象 统…

java中的文件流File

数据 + 流(转)操作 IO I表示的是:输入Input O表示的是:Output Stream表示流转 java中的管道不止一个。并且管道有可能不是一样的。 有的管道粗有的管道细File的常用方法 文件/目录信息 isFile()判断是否是一个文件,返回是一个布尔值,true表示文件。false不是文件 isDirectory…

自建ES集群CVM IO问题

ES集群故障问题描述永辉自建ES集群CVM 出现IO Hang的情况,子机无法登陆,进程也无法kill掉,需要进行节点重启切换来恢复业务。问题背景:2021-05-31日客户侧TKE三台子机的io Await很高,使用的都是本地nvme盘子机,这边登陆了一台机器上面检查发现cpu使用率和io的等待时间都很…

代码随想录——单调栈

单调栈 要求「从 栈顶 到 栈底 的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。(有的文章是从栈底到栈顶,本文默认从栈顶到栈底) 怎么能想到用单调栈呢?…