/Users/liang/AndroidStudioProjects/AIDishRecognitionMainActivityonCreate()。AlarmReceiver。原 Manifest 没有指定启动模式。普通启动 Main 时,如果已有 Main 不在栈顶,系统会创建新实例。 Main 是首页和初始化容器,没有同时保留多个实例的业务需求。
Main₁ → Setting → Main₂
设置页结束自身后,任务栈中可能同时保留两个 Main。
FLAG_ACTIVITY_SINGLE_TOP 只能复用栈顶 Main;Main 被业务页覆盖时点击通知仍会创建新实例。
syncAllAsync() 强制分页拉取全部菜品。Main 原来只注册动态接收器,没有在 onDestroy() 中进行配对注销。
为 Main 配置 android:launchMode="singleTask"。相比 singleTop,
它能够复用任务栈中非栈顶的 Main,并清理其上方页面。
Main 提供 createHomeIntent(Context),统一添加:
FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP
启动页、设置页、MQTT 通知和 AI 就绪回退统一复用该入口。
Main 的 onNewIntent() 只保存最新 Intent,不调用设备初始化、MQTT 判断或菜品同步。
本次保留 syncAllAsync(),不改为六小时缓存同步,也不把同步移动到
onResume()。本次只消除重复 Main 引起的重复同步。
记录注册状态,并在 onDestroy() 中安全注销。
app/src/main/AndroidManifest.xmlMainActivity.javaLaunchActivity.javaSettingActivity.javaCustomMqttService.javaAiReadinessGuard.javasingleTask 兜底。onNewIntent()。
当前 Main 是固定入口卡片,没有依赖设置结果重建的动态列表。后续如果增加刷新需求,
应通过显式 extra 在 onNewIntent() 中处理,不能重新执行全部初始化。
设置页继续依据 FIRST_INIT_FINISH_TAG 区分 LaunchActivity 和 Main,
以保护首次配置流程。
./gradlew :app:compileDebugJavaWithJavac:构建成功。./gradlew :app:testDebugUnitTest :app:assembleDebug:构建成功;
36 项单元测试,0 失败,0 错误。
launchMode 为 singleTask。MainActivity.createHomeIntent(...)。git diff --check。app/build/outputs/apk/debug/app-debug.apk。