Files
FamilyBook_harmonyos/entry/src/main/module.json5
T
laoyang 0bab0cdcc6 v83: 后台定期同步(四层调度,策略照 SyncCalendar)
用户原话:「另外,要有定期同步的功能,就是家书app在后台,也能自动同步
数据,这样打开app,基本上数据就是最新的。同步的策略,去synccalendar找,
里面有办法。」

四层调度(缺一层就会在某种场景下"永远不同步"):
1. 前台:onForeground 时若距上次同步超过 5 分钟,补一次
2. 退后台:requestSuspendDelay 短时任务(单次≤3分钟、单日10分钟配额)
3. 延迟任务:workScheduler(周期 2 小时 —— 系统按活跃分组压制,
   请求更短不报错但不生效)
4. 桌面卡片:updateDuration:1(=30 分钟,唯一不受压制的通道,
   每天上限 50 次);先推卡片再触发同步

关键约束(写错了都不报错,只是静默失效):
- WorkSchedulerExtensionAbility 单次回调上限 2 分钟,必须在 finally 里 stopWork
- 后台扩展跑在独立进程,EntryAbility.onCreate 的初始化一步都没跑过
  ⇒ prepare() 必须补齐 token store / module token / FbDb.open
- 回前台必须 cancelSuspendDelay 归还配额,否则两三天后用光
- workInfo 要带 isPersisted,否则重启后任务永久消失
- abilityName 必须与 module.json5 声明一致,对不上时 startWork 不报错但不回调
- ApplicationInfo 没有 bundleName 字段,包名在 .name

其他:
- 卡片驱动的同步有节流(CARD_MIN_GAP_MS 25 分钟 < 卡片刷新 30 分钟,
  反了就是每次刷新都被跳过、一次都不跑)
- 设置页新增「同步」分组:开关 + 上次同步时间 + 说明

同时修:首页日程红线左侧缺一块(nowLayer 从 Row{圆点;线} 改成单个
Column 满宽 —— Row 里圆点占行首,线只能从第 5vp 起画)

守卫 1106/0、v83 反向验证 10/10 全中、已装机。
2026-10-24 04:25:15 +08:00

123 lines
5.1 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [
"phone",
"tablet"
],
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.GET_NETWORK_INFO"
},
{
// 🔴 质感握姿(左手/右手握持)—— 用户 2026-10-16 第 4 条。
// `multimodalAwareness.motion` 的 `holdingHandChanged` 要求此权限。
// ⚠️ 它是 `system_grant` + `availableLevel: normal` + `provisionEnable: false`
// (在 SDK 的权限定义里核过)⇒ **安装即获得,不会弹授权框**。
// ⚠️ API 20 起才有;低版本设备会抛 801(能力不支持)——
// 代码里已 try/catch 兜住,拿不到就退回默认方向。
"name": "ohos.permission.DETECT_GESTURE"
}
],
"deliveryWithInstall": true,
"installationFree": false,
/* 🔴 v73(用户 2026-10-21「有地址的可以一键导航」):
这是 `bundleManager.canOpenLink()` 的**前置条件**,不是可选配置。
⚠️ 没声明时 `canOpenLink` **不抛错、直接返回 false** ⇒
"手机上装了高德"和"我忘了声明"在运行期长得一模一样,
症状是"导航按钮点了只是复制了一下地点",极难归因。
⚠️ 四个 scheme 必须与 `common/FbNav.ets` 的 `MAP_APPS[].probe` **一一对应**;
加一家地图要么两处一起加,要么两处一起没有。守卫 `_fb_arkts_guard.js` 钉了这条。
⚠️ 只声明 scheme 名(`amapuri`),不带 `://`。 */
"querySchemes": [
"amapuri",
"baidumap",
"maps",
"qqmap"
],
"pages": "$profile:main_pages",
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"description": "$string:EntryAbility_desc",
// 🔴 v45 修:原为 `$media:layered_image`(分层图标),导致桌面图标
// 外面有一圈米色底、且图案显得小。原因:
// · `background.png` 是**纯米色满幅图**(512²)⇒ 那圈底色;
// · `foreground.png` 的图案**只占 44%**,系统还要留安全区
// ⇒ 图案被缩得更小。
// 另一个真 bug:`app.json5` 的分层图在 **AppScope** 下找,
// 但 `background/foreground.png` **只在 entry 里**,AppScope 里没有
// ⇒ 引用落空。
// ⇒ 直接改用与应用内左上角**同一个** `fb_logo`(图案几乎铺满)。
"icon": "$media:fb_logo",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"orientation": "auto_rotation_restricted",
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"ohos.want.action.home"
]
}
]
}
],
"extensionAbilities": [
{
"name": "EntryBackupAbility",
"srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
"type": "backup",
"exported": false,
"metadata": [
{
"name": "ohos.extension.backup",
"resource": "$profile:backup_config"
}
]
},
// 🔴 v66(用户 2026-10-20「做几个和 syncCalendar 差不多的卡片」):
// 桌面服务卡片。三种尺寸(2×2 / 2×4 / 4×4)都登记在 `form_config.json`,
// 这里只声明**提供方**(FormExtensionAbility)。
// ⚠️ `type` 必须是 `form`,`metadata` 的名字必须是 `ohos.extension.form`,
// 少一个桌面就把这个应用当成"没有卡片"。
{
"name": "FbFormAbility",
"srcEntry": "./ets/entryformability/FbFormAbility.ets",
"description": "$string:form_ability_desc",
"type": "form",
"exported": true,
"metadata": [
{
"name": "ohos.extension.form",
"resource": "$profile:form_config"
}
]
},
// 🔴 v83(用户 2026-10-23「要有定期同步的功能,家书app在后台也能自动同步」):
// 延迟任务扩展。由 `common/FbBackgroundSync.ets` 用 `workScheduler.startWork`
// 注册(周期 2 小时、`isPersisted` 重启自动恢复)。
// ⚠️ `name` 必须与 `FbBackgroundSync.ets` 里的 `WORK_ABILITY` **逐字相同**,
// 否则 `startWork` 不报错、但**永远不会有回调**(系统找不到这个扩展)。
// ⚠️ `type` 必须是 `workScheduler`;`exported: false` —— 它只由系统拉起,
// 不需要(也不应该)被别的应用调起。
{
"name": "FbSyncWorkAbility",
"srcEntry": "./ets/syncwork/FbSyncWorkAbility.ets",
"type": "workScheduler",
"exported": false
}
]
}
}