启动页生命周期与客屏第二批修复记录
问题与范围
第一批已解决无网失败弹框锁住启动页、同步结果误判和基础防重复问题。本批继续收口启动链路中的重复人脸请求、页面销毁后网络回调、客屏悬浮窗权限依赖、设备类型数字硬编码,以及通用提示弹框被系统恢复时缺少无参构造的问题。
本批不调整服务端接口、不改变订单和支付业务规则,也不改变已确认的米果三合一客屏适配范围。
代码改动
LaunchActivity.java、StartupFaceInitializationPolicy.java:人员同步接口保存人脸特征后只初始化本地人脸库和内存索引,不再调用旧人脸接口第二次全量下载;启动人员请求纳入页面生命周期取消。CallBackObserver.java、RetrofitClient.java、RetrofitRequest.java:透传并返回请求取消句柄,现有忽略返回值的调用方保持兼容。- 客屏显示:三个页面改用标准
Presentation;删除TYPE_APPLICATION_OVERLAY和SYSTEM_ALERT_WINDOW;首页避免重复创建并在销毁时释放客屏。 - 设备类型常量:相关页面与相机配置改用
DeviceTypeUtils具名常量。 NewSingleTipPop.java:增加无参构造,标题和正文通过 Fragment arguments 保存与恢复。- 新增
StartupFaceInitializationPolicyTest,覆盖人脸支付开启和关闭时的启动决策。
修复后的行为
- 启动阶段每次人员同步只走一套数据来源,不再额外下载一次全量人脸数据。
- 启动页退出后,未完成的人员同步请求会被取消。
- 客屏显示不再要求悬浮窗权限,首页恢复时不会重复创建多个客屏。
- 通用提示弹框被 Android 恢复时可重建并恢复标题与正文。
验证
- TDD 红灯阶段因策略类不存在而编译失败;实现后单测转绿。
- 使用 JDK 8 强制执行
JAVA_HOME=$(/usr/libexec/java_home -v 1.8) bash gradlew :app:testDebugUnitTest :app:assembleDebug --rerun-tasks --console=plain,结果为BUILD SUCCESSFUL,92 个任务执行完成。 - 单元测试共 16 个,失败 0、错误 0、跳过 0。
git diff --check无空白错误;Debug APK 已生成。
边界与真机验证
- 仍需在米果三合一真机确认客屏层级、系统栏遮挡和主屏触摸。
- 弹框动态点击监听仍属于页面运行期对象,不承诺跨进程恢复业务回调。
- 构建仍输出旧版人脸依赖的 D8 stack-map 警告,本次构建成功,该警告不是本批引入。
- 本次未执行 Git 暂存、提交或推送。