我是兰瓶Coding,一枚刚踏入鸿蒙领域的转型小白,原是移动开发中级,如下是我学习笔记《零基础学鸿蒙》,若对你所有帮助,还请不吝啬的给个大大的赞~

前言

目标:在保证可达性与可感知的前提下,降低打扰与功耗;明确通知渠道与打扰分级长任务前台化门槛WorkScheduler 场景与限制,并提供工程落地清单与指标基线。

1 通知(Notification)渠道与打扰分级

1.1 渠道模型

  • 渠道(Channel):同一类业务的通知聚合单元(如“导航进行中”“停车订单”“系统告警”)。
  • 分级(Importance)MIN / LOW / DEFAULT / HIGH / CRITICAL(示例分级,具体以 SDK 为准)。
  • 行为(Behavior):声音、震动、锁屏展示、横幅、角标、静默;由渠道级策略统一控制。

1.2 打扰分级与应用到交通场景

  • CRITICAL(生命/安全相关):碰撞预警、行车危险提示。规则:

    • 允许穿透免打扰(DND)但需严格门控与用户明示授权;
    • 强提醒(声音+震动+横幅),带一键处置(“查看/关闭导航/改道”)。
  • HIGH(强时效):导航分叉/临近出口、预约车位即将到期。规则:

    • 横幅+声音/震动;锁屏可见;与行车状态联动(语音优先)。
  • DEFAULT(一般提醒):停车订单成功/账单出具、日常系统更新。规则:

    • 横幅或仅通知中心;避免声音,合并/折叠展示。
  • LOW/MIN(弱打扰):日报、统计、营销(如开启且合规)。规则:

    • 静默+仅角标/列表,不弹横幅;支持按渠道一键关闭。

1.3 降噪策略

  • 频控与折叠:同渠道 10 分钟内 > N 条自动折叠为“X 条更新”,保留最后 1 条完整内容;
  • 互斥与去重:导航改道中的“前方拥堵”与“路线已更新”互斥显示;
  • 情境感知:驾驶中 → 语音播报优先,屏幕横幅降级;夜间/低电量 → 默认静音;
  • 可见性反馈闭环:未互动 > 3 次自动降低渠道重要级或建议用户调整。

1.4 工程要点

  • 渠道创建 幂等;首次运行引导用户按需开启关键渠道;
  • 通知包含 动作按钮Action)与深链;
  • 为可持续任务(前台服务)提供常驻卡片,展示进度与暂停/停止。

2 前台服务(Foreground Service)与长任务门槛

2.1 何时前台化?

  • 任务满足以下任一条件可考虑前台化:

    1. 持续 > 10 分钟 且用户可感知(导航、录音、下载/上传、同步);
    2. 与安全/定位强相关(行车导航/应急定位);
    3. 系统策略限制下需要较高存活度(但仍需用户明示)。

2.2 必备要素

  • 常驻通知:明确任务状态、剩余时间/进度、关键操作(暂停/结束/查看详情);
  • 前台服务类型标识:音视频播放、位置、数据传输、健康等(按 SDK 分类);
  • 可撤回:用户可在通知卡片内结束任务;应用退出后仍保留服务状态。

2.3 风险与限制

  • 滥用前台会导致审核/商店拦截:

    • 不得以“保活”为目的空转;
    • 不得隐形推送/广告;
    • 必须有持续工作与用户价值的证据(指标日志)。

2.4 资源与功耗控制

  • 前台 ≠ 无限资源:

    • CPU/网络限速仍生效;
    • 视频/定位与传感器频率需场景化降档(如后台/锁屏降低采样)。

3 WorkScheduler:场景、约束与退避

3.1 适用场景

  • 延迟容忍的后台工作:日志上报、模型/离线包下载、缓存清理、定期同步;
  • 条件触发:充电、空闲、仅 Wi‑Fi、设备温度正常、存储充足;
  • 一次性 / 周期性 / 约束组合 任务。

3.2 关键约束(示例枚举,落地以 SDK 为准)

  • RequiresChargingRequiresDeviceIdleNetworkType(UNMETERED|ANY)RequiresStorageNotLowRequiresBatteryNotLow
  • 延时 minLatency、截止 deadline、重复 periodicity
  • 并发/配额:同应用并行任务数与每日触发上限(需遵守系统策略)。

3.3 退避与重试

  • 指数回退base=30s, factor=2, max=30min
  • 抖动:在 ±10% 范围内随机化触发时间,避免集群脉冲。

3.4 取消与幂等

  • 任务以 jobId 唯一标识;重复调度需先 cancel(jobId)
  • 任务执行函数 幂等:按“上次成功 checkpoint”续传/续处理。

3.5 与前台服务的协同

  • 大下载/同步:在 充电 + Wi‑Fi + 空闲 时通过 WorkScheduler 拉起;
  • 用户主动触发且需实时进度 → 切换前台服务(含常驻通知);
  • 任务长时间等待 → 以通知提示“等待合适条件,点击改为蜂窝网络继续”。

4 指标、功耗与体验基线

4.1 指标面板(必备)

  • 通知:发出/展示/点击/静音比、折叠率、误触率;
  • 前台服务:平均/峰值 CPU、网络下行/上行速率、持续时长、用户终止率;
  • WorkScheduler:任务触发成功率、平均等待时长、退避次数、失败原因分类;
  • 功耗:前台服务期间单位时间电量消耗(%/h),低电量模式下对比;
  • 稳定性:ANR/崩溃、服务重启次数、权限拒绝率。

4.2 目标基线(建议)

  • 导航/录音等前台服务:CPU 平均 < 8% / 峰值 < 20%(中端设备),流量按业务计费策略门控;
  • 长下载:Wi‑Fi 下限速至 不影响前台交互(屏幕帧时 P95 < 16.6ms);
  • 通知点击转化率(关键渠道)≥ 20%,被静音率 < 8%。

5 工程范式(伪代码示例)

5.1 创建渠道与发送分级通知

createChannel({
  id: 'nav.realtime', name: '导航进行中', importance: 'HIGH', sound: true, vibrate: true,
  bypassDnd: false, showOnLockscreen: true
})
createChannel({ id: 'safety.alert', name: '安全告警', importance: 'CRITICAL', bypassDnd: true })

sendNotification({
  channelId: 'nav.realtime', title: '前方 500m 分岔', text: '请保持右侧车道,随后驶入匝道',
  actions: [{ title: '改道', deepLink: 'app://nav/replan' }, { title: '静音本次', intent: 'mute_once' }],
  group: 'NAV', collapseKey: 'fork-123'
})

5.2 前台服务(含常驻通知)

startForegroundService({
  type: 'LOCATION',
  notification: {
    channelId: 'nav.realtime',
    title: '正在导航', text: '剩余 18 分钟 · 12.6km',
    actions: [{ title: '结束', intent: 'nav_stop' }, { title: '暂停语音', intent: 'tts_toggle' }]
  }
})

5.3 WorkScheduler 任务

scheduleWork({
  jobId: 2001,
  constraints: { requiresCharging: true, networkType: 'UNMETERED', requiresDeviceIdle: true },
  minLatency: '15m', deadline: '2h', backoff: { policy: 'EXPONENTIAL', base: '30s', max: '30m' }
})

onWorkExecute(2001, async () => {
  await downloadInChunks({ resume: true, limitMbps: 8 }) // 幂等 + 限速
  markSuccess(2001)
})

6 落地检查清单

  • 为每类业务建立独立渠道并默认合理分级;
  • 高打扰渠道需用户显式授权,可穿透 DND 的场景有审计凭证;
  • 所有常驻前台任务均有可见通知卡片一键结束
  • 大任务默认 WorkScheduler(充电+Wi‑Fi+空闲),必要时才前台化;
  • 任务幂等 + 断点续,统一退避策略与抖动;
  • 指标仪表盘上线:通知/前台/调度/功耗/稳定性全链路;
  • 低电量/夜间/驾驶/弱网等情境策略已覆盖并压测通过。

7 常见反模式

  • 滥用 CRITICAL 渠道穿透免打扰,或以营销通知误导用户;
  • 为“保活”无实际工作前台化,或隐藏常驻通知;
  • WorkScheduler 任务未设约束与退避,导致唤醒风暴;
  • 下载/同步不做限速,挤占前台交互与媒体播放。

8 小结

通过渠道分级 + 情境降噪前台化门槛与可见卡片,以及WorkScheduler 约束/退避三件套,可以在保障关键任务可达性的同时,将打扰与功耗控制在可接受范围。建议配套统一的策略中心与指标看板,持续 A/B 调优,确保体验与合规稳态。

(未完待续)

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。