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

Android 的多进程机制 (Android Multi-Process Model)

1. 核心概念

  • 独立进程会创建新的虚拟机:每个进程有独立的 ART/Dalvik 虚拟机。

  • 但共享同一个 APK:所有代码、资源都从同一个 APK 加载。

  • Application 多实例:每个进程都会新建一个 Application 实例并执行 onCreate()

✅ 一句话总结:

在 Android 中,每个进程都有独立的虚拟机和 Application 实例,但它们共享同一个 APK 文件的代码与资源。


2. 虚拟机与 Application 行为

  • 同一个 APK → 全部进程使用相同的 .QMaxApplication 类。

  • 不同进程 → 系统会为每个进程创建新的虚拟机和新的 Application 实例。

  • Application.onCreate() → 每个进程都会调用一次,导致可能 重复初始化


3. 实例对比

主进程 (com.robot.qmaxsysapp)

├── 虚拟机1
├── QMaxApplication 实例1
└── MainActivity

独立进程 (com.robot.qmaxsysapp:voice_command_service)

├── 虚拟机2 ← 新的虚拟机
├── QMaxApplication 实例2 ← 新的实例
└── VoiceCommandService


4. 配置示例

<application android:name=".QMaxApplication"><!-- 主进程 --><activity android:name=".MainActivity" /><!-- 独立进程 --><serviceandroid:name="com.robot.mod_voicecommand.service.VoiceCommandService"android:process=":voice_command_service" />
</application>

5. 问题场景

主进程和独立进程都调用了 QMaxApplication.onCreate()

  • 主进程初始化模块 → TCP 服务占用端口 10110。
  • 独立进程再次初始化 → 冲突!

BindException: Address already in use(端口被占用)

ClassCastException: BinderProxy cannot be cast...(跨进程 Binder 错误)


6. 解决方案

根据进程名,区分初始化逻辑:

override fun onCreate() {super.onCreate()val currentProcess = getCurrentProcessName()if (isMainProcess(currentProcess)) {// 主进程:完整初始化initModules()} else {// 独立进程:只做基础初始化initBasicComponentsOnly()}
}
  • 主进程 → 初始化所有业务模块 (TCP/WebSocket/业务逻辑)。

  • 独立进程 → 仅初始化基础组件 (日志、MMKV、CrashHandler)。


7. 核心思想

👉 多进程环境下,Application.onCreate() 会被调用多次。
要避免重复初始化,必须 按进程类型做有选择的初始化

  • 主进程:完整初始化(TCP 服务、模块加载)。

  • 独立进程:最小化初始化(仅运行独立服务)。


⚡ 这就是 Android 多进程机制下 Application 重复初始化的问题与解决方案

http://www.dtcms.com/a/393776.html

相关文章:

  • 2025研究生数学建模通用神经网络处理器下的核内调度问题草案
  • Spring Boot 4 新特性详解:5大核心更新助力企业级开发
  • 计算机网络经典问题透视:网络利用率和网络时延之间,究竟存在着怎样一种“爱恨交织”的关系?我们梦寐以求的100%网络利用率,在现实世界中真的能够实现吗
  • requests 和 lxml 库的xpath实现
  • 前端梳理体系从常问问题去完善-工程篇(webpack,vite)
  • Go语言在K8s中的核心优势
  • 旅游门票预订系统支持微信小程序+H5
  • Requests 网络请求:Python API 交互与数据获取
  • 基于Dify实现简历自动筛选过滤
  • PHP中常见数组操作函数
  • 避坑指南:鸿蒙(harmony next)APP获取公钥和证书指纹的方法
  • Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进中的深度应用(414)
  • 【场景题】如何解决大文件上传问题
  • 云原生复杂多变的环境中的安全防护方案
  • Python10-逻辑回归-决策树
  • 如何生成一个不会重复随机数?
  • 【精品资料鉴赏】155页WORD大型制造企业MES制造执行系统建设方案
  • 定时计划任务
  • 【脑电分析系列】第23篇:癫痫检测案例:从频谱特征到深度学习模型的CHB-MIT数据集实战
  • `CookieStore` API
  • 数据可视化的中间表方案
  • 编译运行duckdb rust插件模板extension-template-rs
  • 接口测试流程+jmeter并发+面试题(总结)
  • JMeter下载安装及入门教程
  • Oracle体系结构-Java Pool详解
  • ​​Service Worker 缓存 与 HTTP 缓存 是什么关系?
  • c++ 之三/五法则
  • 传输层协议 UDP
  • 关于类和对象(一)
  • 多人协作下的游戏程序架构 —— 分层方案