MainActivity 同任务栈单实例修复实施记录
日期:2026-07-23
代码已实施
36 项测试通过
Debug 构建成功
待指定设备真机回归
Main 已建立同任务栈单实例约束;设置页、启动页、MQTT 通知和 AI 就绪回退统一复用已有 Main,
回到已有 Main 时不重复初始化和全量拉取菜品。
变更日期
2026-07-23
变更目标
- 保证 MainActivity 在同一任务栈内只有一个实例。
- 统一所有显式回首页入口。
- 复用 Main 时不重复执行初始化和菜品全量同步。
- 补齐动态注册 AlarmReceiver 的销毁注销。
问题原因
- 默认 standard 启动模式允许在 Main 非栈顶时创建新实例。
- MQTT 通知原有 singleTop 只能复用栈顶 Main。
- 新 Main 会重新执行设备初始化、MQTT/定时任务判断和菜品全量同步。
- AlarmReceiver 原来没有在 Main 销毁时注销。
业务代码变更
AndroidManifest.xml
为 Main 设置 android:launchMode="singleTask"。
MainActivity.java
- 新增统一入口
createHomeIntent(Context)。
- 统一添加
CLEAR_TOP | SINGLE_TOP。
- 新增
onNewIntent(),不重复执行初始化。
- 记录 AlarmReceiver 注册状态并在
onDestroy() 中安全注销。
- 保留冷启动时的菜品全量同步行为。
回首页调用方
SettingActivity:首次初始化完成后复用统一首页入口。
LaunchActivity:初始化完成进入 Main 时使用统一入口。
CustomMqttService:通知 PendingIntent 使用统一入口。
AiReadinessGuard:AI 就绪失败回首页使用统一入口。
实际变更文件
app/src/main/AndroidManifest.xml
MainActivity.java
LaunchActivity.java
SettingActivity.java
CustomMqttService.java
AiReadinessGuard.java
- 同名 Markdown/HTML 修复方案和实施记录。
验证结果
./gradlew :app:compileDebugJavaWithJavac:构建成功。
-
./gradlew :app:testDebugUnitTest :app:assembleDebug:构建成功;
36 项单元测试,0 失败,0 错误。
- 合并后的 Debug Manifest 已确认 Main 的
launchMode 为 singleTask。
- 所有业务调用方均使用
MainActivity.createHomeIntent(...)。
- 本次 6 个业务文件通过
git diff --check。
- Debug APK:
app/build/outputs/apk/debug/app-debug.apk。
未执行项
当前检测到 3 台在线设备,但用户未指定安装和回归目标,因此没有安装 APK。
待指定设备后验证设置页返回、MQTT 通知回首页、连续往返后的任务栈实例数量、
菜品同步提示和 Receiver 泄漏日志。
结论
Main 的单实例约束、统一回首页入口、重复 Intent 处理和 Receiver 生命周期释放已按方案落地。
自动化测试、Debug 构建、合并 Manifest 和静态入口检查均已通过;
真机任务栈和通知回首页行为待指定目标设备后回归。