本文档用于梳理当前项目从应用启动,到配置准备、初始化执行、人员/人脸同步、后台保活,再到最终进入 MainActivity 的完整流程。
目标是保证以下事项在项目移植后闭环成立:
MainActivityapp/src/main/java/com/cpt/aidishrecognition/activity/LaunchActivity.javaapp/src/main/AndroidManifest.xml应用冷启动时,系统会先拉起 LaunchActivity。
app/src/main/java/com/cpt/aidishrecognition/application/CptApplication.javaApplication.onCreate() 中完成:
PreferenceUtilsCrashHandlerOkHttpClientWorkSchedulerCustomMqttService这意味着即使还未完成前台页面初始化,后台同步链路和 MQTT 服务已经具备启动条件。
配置页面:
app/src/main/java/com/cpt/aidishrecognition/activity/SettingActivity.javaapp/src/main/java/com/cpt/aidishrecognition/fragment/SettingsBasicFragment.javaapp/src/main/java/com/cpt/aidishrecognition/fragment/SettingsPaymentFragment.javaLaunchActivity.checkConfig() 会校验以下配置:
CUSTOMER_BASE_URLPAIR_CODEPAYMENT_WAY_FACE_RECOGNITIONPAYMENT_WAY_SWIPE_CARDPAYMENT_WAY_SCAN_QRCODESETTING_FACE_ACTIVATION_CODE通过 SettingsBasicFragment.syncPairInfo() 调用配对接口后,会落地以下关键数据:
DEVICE_CODEBUSINESS_IDENTIFY_IDCONSUME_WORK_NUMBER对应记录逻辑在:
app/src/main/java/com/cpt/aidishrecognition/utils/DeviceSyncInfoRecorder.javaLaunchActivity.onCreate() 后先执行权限检查:
READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGECAMERA全部通过后进入 next()。
next() -> checkConfig()
SettingActivitysyncUserList()LaunchActivity.syncUserList() 调用:
RetrofitRequest.syncUserInfoList(deviceCode, type)其中 type 规则:
1,全量同步0,增量同步首启标记:
FIRST_INIT_FINISH_TAG同步结果进入:
BatchCustomerSyncManager该阶段会做两件事:
customer.dbFaceApi 人脸库相关类:
app/src/main/java/com/cpt/aidishrecognition/manager/BatchCustomerSyncManager.javaapp/src/main/java/com/cpt/aidishrecognition/manager/CustomerSyncManager.javaapp/src/main/java/com/cpt/aidishrecognition/dataabase/CustomerDBHelper.javaapp/src/main/java/com/cpt/aidishrecognition/dataabase/CustomerDatabaseManager.javaLaunchActivity.checkFaceConfig():
MainActivity类:
app/src/main/java/com/cpt/aidishrecognition/faceRecognition/activation/ActivationFaceSDK.java流程:
SETTING_FACE_ACTIVATION_CODEActivationFaceSDK.isActivated() 判断是否已激活activation()类:
app/src/main/java/com/cpt/aidishrecognition/faceRecognition/model/InitFaceModelManager.java作用:
registerlibrary 中的人脸模型FaceSDKManager.initModelSuccess类:
app/src/main/java/com/cpt/aidishrecognition/faceRecognition/dbapi/InitFaceDBApiManager.java作用:
FaceApi.init()FaceApi.users完成 DB 初始化后,LaunchActivity.requestFaceDataSync() 调用:
FaceDataUpdaters.performUpdate(type)类:
app/src/main/java/com/cpt/aidishrecognition/utils/FaceDataUpdaters.java处理逻辑:
status 处理新增、更新、删除状态约定:
1 新增2 更新3 删除FaceDataUpdaters.updateSuccess() 回调后:
FIRST_INIT_FINISH_TAG = trueMainActivity到此,前台启动初始化完成。
入口:
app/src/main/java/com/cpt/aidishrecognition/utils/WorkScheduler.java启动时会注册三类任务:
UploadOrderWorkerOrderDeleteWorkerUpdateFaceWorkerHeartBeatWorker类:
app/src/main/java/com/cpt/aidishrecognition/workmanager/UpdateFaceWorker.java逻辑:
DEVICE_CODE 是否存在FaceDataUpdaters.performUpdate("0")类:
app/src/main/java/com/cpt/aidishrecognition/workmanager/HeartBeatWorker.java逻辑:
/p/api/heartbeatface_updateface_update == 1,立即触发一次人脸增量同步心跳的作用不是直接写库,而是作为“服务端要求刷新人脸库”的触发信号。
类:
app/src/main/java/com/cpt/aidishrecognition/service/CustomMqttService.java服务由两处触发:
CptApplication.onCreate()BootCompletedReceiver.onReceive()CustomMqttService.initMqttConfig() 会先判断:
DEVICE_CODE 是否存在会订阅两个 topic:
DeviceSyncInfoRecorder.getSubscribeTopic()ALIBABA_CONFIG_TOPIChandleArrivedMsg() 按 type 分流:
type = 1:人脸消息type = 3:订单消息type = 4:人员消息handleFaceBody():
SingleStaffDataBeanFaceDataUpdaters.saveSingleBeanToDB()FaceApi 内存用户列表/p/api/feedback 执行消息反馈handleUserBody():
CustomerCustomerSyncManager.syncCustomerAndFace()customer.dbfeature,同步写入人脸库FaceApi 内存用户列表/p/api/feedback 执行消息反馈因此,MQTT 人员消息和人脸消息都能推动数据库与人脸库保持一致。
类:
app/src/main/java/com/cpt/aidishrecognition/utils/SyncStrategyManager.java当前策略判断较直接:
DEVICE_CODE:允许 MQTT 实时同步DEVICE_CODE:允许定时增量同步DEVICE_CODE:允许心跳策略组合说明:
mqtt + timedtimednone类:
app/src/main/java/com/cpt/aidishrecognition/utils/CrashHandler.javaapp/src/main/java/com/cpt/aidishrecognition/activity/CrashActivity.java流程:
CrashHandlerCrashActivityAlarmManager + PendingIntent 重新拉起应用作用:
类:
app/src/main/java/com/cpt/aidishrecognition/receiver/BootCompletedReceiver.java系统广播到达后:
WorkSchedulerCustomMqttService也就是说,设备重启后会重新走完整启动初始化链。
当前项目人员/人脸一致性由以下几层共同保证:
这五层叠加后,目标状态是:
customer.db 与服务端人员信息保持一致FaceApi/DBManager 中的人脸库与服务端人脸信息保持一致只有满足以下条件后,才认为启动初始化完成并进入 MainActivity:
CptApplication 初始化偏好、崩溃拦截、网络层、后台 Worker、MQTT 服务LaunchActivity 启动customer.db,带特征人员同时更新人脸库MainActivityapp/src/main/java/com/cpt/aidishrecognition/application/CptApplication.javaapp/src/main/java/com/cpt/aidishrecognition/activity/LaunchActivity.javaapp/src/main/java/com/cpt/aidishrecognition/activity/SettingActivity.javaapp/src/main/java/com/cpt/aidishrecognition/fragment/SettingsBasicFragment.javaapp/src/main/java/com/cpt/aidishrecognition/fragment/SettingsPaymentFragment.javaapp/src/main/java/com/cpt/aidishrecognition/utils/DeviceSyncInfoRecorder.javaapp/src/main/java/com/cpt/aidishrecognition/utils/FaceDataUpdaters.javaapp/src/main/java/com/cpt/aidishrecognition/manager/BatchCustomerSyncManager.javaapp/src/main/java/com/cpt/aidishrecognition/manager/CustomerSyncManager.javaapp/src/main/java/com/cpt/aidishrecognition/service/CustomMqttService.javaapp/src/main/java/com/cpt/aidishrecognition/workmanager/UpdateFaceWorker.javaapp/src/main/java/com/cpt/aidishrecognition/workmanager/HeartBeatWorker.javaapp/src/main/java/com/cpt/aidishrecognition/utils/WorkScheduler.javaapp/src/main/java/com/cpt/aidishrecognition/utils/CrashHandler.javaapp/src/main/java/com/cpt/aidishrecognition/activity/CrashActivity.javaapp/src/main/java/com/cpt/aidishrecognition/receiver/BootCompletedReceiver.java当前项目已经具备一条完整的“配置 -> 启动 -> 人员同步 -> 人脸初始化 -> 人脸同步 -> 进入主页 -> 运行期持续同步”的闭环链路。
从整体逻辑上看,当前版本已经满足: