当前位置: 首页 > news >正文

Android中Activity销毁底层原理

Activity销毁底层原理流程图


核心流程详解

1. 用户进程发起销毁
// Activity.java
public void finish() {if (mParent == null) {int resultCode;Intent resultData;synchronized (this) {resultCode = mResultCode;resultData = mResultData; // 保存setResult数据}// 通过Binder通知AMSActivityManager.getService().finishActivity(mToken, resultCode, resultData, 0);}
}
2. AMS处理阶段

3. 暂停当前Activity
  • 关键代码

    // ActivityStack.java
    void startPausingLocked() {mPausingActivity = prev;prev.state = PAUSING;// 通过Binder回调应用进程prev.app.thread.schedulePauseActivity(prev.appToken, false);schedulePauseTimeout(prev); // 设置超时检测(10s)
    }
  • 超时处理:若10秒内未收到activityPaused()回调,AMS强制推进流程

4. 启动新Activity
// ActivityStackSupervisor.java
void resumeFocusedStackTopActivityLocked() {// 回调结果给新Activitynext.app.thread.scheduleSendResult(next.appToken, results);// 启动新Activitynext.app.thread.scheduleResumeActivity(next.appToken);
}
5. 销毁原Activity

6. 窗口销毁关键
// WindowManagerGlobal.java
void removeView(View view, boolean immediate) {ViewRootImpl root = view.getViewRootImpl();root.die(immediate); // 触发View树解绑root.dispatchDetachedFromWindow(); // 释放SurfaceSurfaceControl sc = root.getSurfaceControl();sc.release(); // 通知SurfaceFlinger回收图形缓冲区
}

常见问题

Q1:finish()后Activity是否立即销毁?

A:不是!销毁分三个阶段:

  1. 同步阶段(主线程阻塞):

    • 立即执行onPause()

    • 通过Binder通知AMS

  2. 异步暂停阶段(约10ms):

    • 等待onPause()完成

    • AMS启动新Activity

  3. 延迟销毁阶段(主线程空闲):

    • 执行onStop()onDestroy()

    • 窗口移除和资源回收在VSync信号后完成

Q2:onDestroy()里能做耗时操作吗?

A:绝对禁止!原因:

  1. onDestroy()执行在主线程,阻塞会导致:

    • 新Activity启动延迟(ANR风险)

    • 窗口移除延迟(视觉卡顿)

  2. 正确做法:

    public void onDestroy() {// 快速释放资源releaseResources();// 耗时操作交给子线程new Thread(() -> cleanUpDiskFiles()).start();
    }
Q3:Activity结果如何传递?

A:通过AMS中转:

  1. setResult()保存到ActivityRecord

  2. AMS通过scheduleSendResult()回调新Activity

  3. 数据流:

Q4:窗口如何被移除?

A:四步销毁链:

  1. WindowManager.removeView() 触发View树解绑

  2. ViewRootImpl.die() 提交帧回调事件

  3. Surface.release() 通知SurfaceFlinger回收图形缓冲区

  4. Choreographer 在下一VSync信号完成移除


总结

Q:请说明Activity从finish()到完全销毁的底层过程?

A

Activity销毁是一个跨进程协作的过程,核心流程分三个阶段:

1. 发起阶段(用户进程)
调用finish()后:

  • 保存setResult()数据

  • 通过Binder IPC调用AMS的finishActivity()

2. 调度阶段(AMS)
AMS收到请求后:

  • 标记ActivityRecord为FINISHING状态

  • 启动暂停流程:通过Binder回调schedulePauseActivity()

  • 等待onPause()完成(设置10秒超时)

  • 启动下一Activity并传递结果数据

3. 销毁阶段(延迟执行)
当主线程空闲时:

  • AMS发送scheduleStopActivity()scheduleDestroyActivity()

  • 顺序执行onStop()onDestroy()

  • 关键销毁操作:

    • 移除DecorView:WindowManager.removeView()

    • 释放Surface:通过SurfaceControl.release()通知SurfaceFlinger

    • 资源回收:主线程空闲时触发GC

设计精髓

  • 跨进程协作:通过Binder IPC解耦

  • 异步销毁:避免阻塞UI线程

  • 结果中转:AMS保证数据可靠传递

  • 超时机制:防止进程卡死(PAUSE/DESTROY_TIMEOUT)

http://www.lryc.cn/news/617891.html

相关文章:

  • GSON 框架下百度天气 JSON 数据转 JavaBean 的实战攻略
  • Mysql——Sql的执行过程
  • 从 0 到 1:用 MyCat 打造可水平扩展的 MySQL 分库分表架构
  • Linux-常用命令
  • 深入解析 resolv.conf 文件:DNS 配置的核心
  • 驱动_ConfigFS多级目录操作
  • 光功率dBm为何是负数?一文详解
  • Google OAuth 配置步骤指南,实现Google Drive文件同步功能。
  • UVM验证—UVM 简述
  • 快速了解TF-IDF算法
  • 逐际动力开源运控 tron1-rl-isaacgym 解读与改进
  • 自由学习记录(81)
  • 5B 参数,消费级显卡可部署:Wan2.2-TI2V-5B 本地部署教程,9分钟跑出电影级大片!
  • 【运维进阶】WEB 服务器
  • GB17761-2024标准与电动自行车防火安全的技术革新
  • Redis 数据结构及特点
  • 【工作笔记】Wrappers.lambdaQuery()用法
  • ROS2学习(1)—基础概念及环境搭建
  • JavaEE 初阶第十七期:文件 IO 的 “管道艺术”(下)
  • vscode新建esp32工程,没有sample_project怎么办?
  • 计算机网络:ovn数据通信都是用了哪些协议?
  • 应用层模拟面试题
  • C语言(06)——二、八、十、十六进制的相互转换
  • Effective C++ 条款35:考虑 virtual函数以外的其他选择
  • 【已解决】报错:WARNING: pip is configured with locations that require TLS/SSL
  • HarmonyOS 开发入门 第一章
  • 一文读懂 C# 中的 Lazy<T>
  • Python 在自动化办公汇总和脚本示例
  • 本地文件夹与 GitHub 远程仓库绑定并进行日常操作的完整命令流程
  • 【基本有序数组中找到有且仅有的一个无序元素并进行排序之顺序法】2022-10-12