laoyang
3025f92cb6
0.0.8:借服务卡片 30 分钟刷新驱动后台同步
用户反馈"基本不会定期同步,每次都要手动点进去才同步"。
诊断发现主因是「后台自动同步」默认关闭(workScheduler 2 小时兜底根本没注册),
且系统对普通应用后台频率有硬管控(活跃分组下限 2 小时)。
本提交新增一条**免权限、约 30 分钟一次**的定期同步路径:
利用服务卡片已有的定时刷新(form_config.json 的 updateDuration=1,**单位 30 分钟**,
系统每 30 分钟调用一次 onUpdateForm),在该回调里顺带跑一次后台同步。
改动:
1. AppSettings 新增 `card_sync_at`(上次卡片驱动同步时间戳,用于节流)。
2. BackgroundSyncRunner 新增 `runOnceThrottledByCard(context)`:
· 节流 CARD_MIN_GAP_MS = 25 分钟(略小于 30 分钟卡片周期,避免系统刷新漂移被误跳过);
· **先写时间戳再执行** → 防止同步期间卡片再次刷新导致并发重入;
· 复用现有 `runOnce(context,'cardTick')`(完整同步:入站对账→推送→拉取→镜像→刷新卡片与提醒);
· **永不抛错**(后台路径没有 UI 承担异常)。
3. EntryFormAbility.onUpdateForm:
· ① 先用**本地缓存**立刻刷卡片(毫秒级,不依赖网络);
· ② 再跑节流同步,完成后二次推卡片数据,让卡片显示刚同步回来的结果。
⚠️ 关键约束(官方 FormExtensionAbility 生命周期原文):
"FormExtensionAbility 进程不能常驻后台,生命周期回调中无法处理长时间的任务,
生命周期调度完成后会继续存在 **10 秒**……可能需要 10 秒以上才能完成的业务逻辑,
建议拉起主应用进行处理。"
⇒ 同步**可能被进程回收中断**,故:
· 设 **9 秒软超时**主动收手(干净放弃而非被硬杀在半途);
· 语义明确为"**尽力而为地提高后台同步频率**",不承诺 30 分钟必然成功;
· 中断安全:同步幂等(etag 增量比对 + dirty 标记),中断不损坏数据,
下个周期会重试;正常网络下增量同步通常数秒内完成,落在窗口内;
· **不采用"拉起主应用同步"** —— 那会每 30 分钟弹出一次界面,体验不可接受。
配额核算:卡片定时刷新官方上限为**每张卡片每天 50 次**;30 分钟一次 = 48 次/天,
**不超配额**。相比 workScheduler(受活跃分组压制到 ≥2 小时),频率提升约 4 倍。
验证:编译通过(BUILD SUCCESSFUL);节流逻辑离线用例通过
(从未同步/30 分钟/26 分钟/正好 25 分钟 → 执行;24/5/1 分钟 → 跳过)。
2026-10-14 16:42:04 +08:00
..
2026-10-14 16:42:04 +08:00
2026-10-10 12:49:11 +08:00
2026-09-13 15:50:37 +08:00
2026-10-14 16:42:04 +08:00
2026-10-14 14:00:58 +08:00
2026-10-10 12:49:11 +08:00