# Deep Cleaner 保活通知规则 v1.1.1

产品：Tidyvo Cleaner · 平台：Android · 版本：v1.1.1 · 更新日期：2026-09-03

文档状态：v1.1.1 通知需求唯一执行真源。当前已包含已确认的全局规则、具体通知场景、模板、中英文文案、路由、案例和普通通知埋点；不讨论保活技术实现。历史 [场景方案初稿](../99-归档/Deep-Cleaner-v1.1.1-保活通知-2026-09-01/Deep%20Cleaner-v1.1.1-保活通知场景方案-初稿.md) 与 [竞品参考版](../99-归档/Deep-Cleaner-v1.1.1-保活通知-2026-09-01/Deep%20Cleaner-v1.1.1-保活通知方案-竞品参考版.md) 已归档，仅供追溯，不作为执行依据。

## 1. 通知分类与适用范围

| 序号 | 规则 | 适用对象 | 已确认内容 | 后台控制 / 默认值 | 案例或说明 |
|---:|---|---|---|---|---|
| 1 | 四类可见通知 | 全部通知 | 沿用 v1.0.6 的四类定义：①普通通知；②常驻通知；③ Notification Cleaner 汇总通知；④ FCM 可见通知。 | 不涉及 | 主动通知和被动通知均归入普通通知。 |
| 2 | 普通通知子类 | 普通通知 | ①主动通知：Tidyvo 主动检查设备当前状态后生成；②被动通知：安装、卸载、新增文件、充电、任务结果等真实事件发生后生成。 | 两类分别控制 | 后续每个具体场景只归入主动或被动其中一类。 |
| 3 | 三类独立通知 | 常驻通知、Notification Cleaner 汇总通知、FCM 可见通知 | 三类通知完全独立，不执行主动/被动通知的间隔、统一日上限、单场景日上限、展示时间段、下放范围、通知栏显示上限和候选竞争规则；不占用普通通知计数或通知栏名额，也不会被普通通知覆盖。Android 系统限制仍然有效。 | 各自按自身规则控制 | FCM 可见通知到达时，即使普通通知已满日上限，也不因此被拦截。 |

## 2. 展示前提与时间规则

| 序号 | 规则 | 适用对象 | 已确认内容 | 后台控制 / 默认值 | 案例或说明 |
|---:|---|---|---|---|---|
| 4 | 通知下放范围 | 主动通知、被动通知 | 仅支持 `OFF / ORGANIC_ONLY / PAID_ONLY` 三态。`OFF` 全部关闭；`ORGANIC_ONLY` 仅自然量用户生效；`PAID_ONLY` 仅推广用户生效；无法识别来源时不展示普通通知。 | 后台自定义参数 | 三态仅控制普通通知。 |
| 5 | 首次通知延迟 | 主动通知、被动通知 | 从 App 安装时间起算；未达到首次通知延迟时，不展示普通通知。正常升级 App 不重新计时；卸载后重新安装按新的安装时间重新计时；首次打开 App 不重新计时。 | 后台自定义参数；默认 5 分钟 | 用户安装 30 分钟后才首次打开 App，首次打开不会把延迟重新计算为 0；正常升级也不会重新进入首次延迟。 |
| 6 | 后台配置兜底 | 主动通知、被动通知 | 成功取得并校验通过的新配置后，将其保存为新的有效配置。配置拉取失败、超时或内容异常时，继续使用本机保存的上一次有效配置；新安装且从未取得过有效配置时，普通通知保持关闭，直至取得首份有效配置。 | 固定兜底规则 | 已保存配置 A 时，本次请求失败继续使用 A；新安装用户首次请求失败时不展示普通通知。 |
| 7 | 统一展示前提 | 主动通知、被动通知 | 必须同时满足：①Tidyvo 处于后台；②设备屏幕已点亮且已解锁；③处于允许展示时间段；④Android 系统允许展示通知；⑤用户符合下放范围；⑥场景开关开启；⑦对应频控间隔、统一日上限和单场景日上限均未达到限制；⑧场景真实条件成立。 | 各项按对应后台参数判断 | Tidyvo 正在前台时不展示普通通知。 |
| 8 | 熄屏与锁屏 | 主动通知、被动通知 | 熄屏或锁屏期间不展示普通通知。解锁后重新读取当前真实状态，不直接补发此前的一次性事件；仍然存在的状态可在主动检查中重新成为候选。 | 不单独配置 | 锁屏期间新增文件不直接弹通知；解锁后若文件仍存在，可按当前状态重新判断。 |
| 9 | 展示时间段 | 主动通知、被动通知 | 按手机当地时间判断。被动事件发生在允许展示时间段之外时，本次事件不顺延到下一个展示时间段。 | 展示开始时间、展示结束时间均由后台自定义；默认值本轮不设定 | 允许时段为 08:00–22:00 时，23:00 的一次性事件不会在次日 08:00 补发。 |

## 3. 频控与候选选择

| 序号 | 规则 | 适用对象 | 已确认内容 | 后台控制 / 默认值 | 案例或说明 |
|---:|---|---|---|---|---|
| 10 | 主动轮询与场景间隔 | 全部主动场景 | 达到首次通知延迟，且普通通知启用、Tidyvo 处于后台、设备亮屏解锁、处于允许展示时间段、系统通知能力和下放范围可用后，每隔 `active_poll_interval_minutes` 检查主动场景。所有主动场景共用 `default_interval_minutes` 这一套间隔时长，但每个场景 ID 独立记录最近一次成功投递时间；同一场景 ID 的全部模板共用该场景间隔，不设置模板独立间隔。轮询未命中或投递失败时，不更新场景间隔、次数、模板轮换状态或检查起点。主动场景间隔不占用被动通知间隔。 | `active_poll_interval_minutes` 默认 2 分钟；`default_interval_minutes` 默认 15 分钟 | A10 在 10:00 成功投递后，A10-A 与 A10-B 均需等到 10:15 才能再次参与；A03 不受 A10 的场景间隔影响，可在后续轮询中参与。 |
| 11 | 被动通知间隔 | 全部被动场景 | 所有被动场景共用一个被动通知间隔，不按场景分别计时；任意被动通知成功投递后，重新计算被动通知间隔。被动间隔不占用主动间隔。 | 后台自定义参数；默认值本轮不设定 | 安装事件通知成功投递后，随后发生的卸载事件也受同一个被动间隔控制。 |
| 12 | 单次展示与优先级 | 主动通知、被动通知 | 同一检查时机最多展示一条普通通知；主动和被动同时合格时，被动优先。多个被动场景同时合格时，从当前合格的被动场景中等概率选择一个。 | 固定规则 | 新截图事件与低存储主动场景同时合格时，先从被动场景中选择；多个被动事件同时合格时随机选一个。 |
| 13 | 主动场景顺序检查 | 全部主动场景 | 主动场景按 `A01 → A02 → … → A10` 固定顺序循环检查。首次从 A01 开始；每轮从当前检查起点依次向后判断，查到第一个合格场景后即选定并结束本轮检查，不再随机选择其他主动场景。成功投递后，下次从本次场景的下一个 ID 开始；A10 后回到 A01。完整检查一圈无合格场景时不展示且起点不移动；选定场景投递失败时本轮结束且起点不移动。 | 固定规则 | 首次从 A01 开始检查，A01 至 A04 均不合格、A05 合格，则展示 A05；成功后下次直接从 A06 开始检查。 |
| 14 | 同场景模板轮换 | 主动通知、被动通知 | 选定场景后，从当前合格且在本场景本轮模板周期内尚未成功投递的模板中等概率选择一套。模板只有成功投递后才标记为本轮已使用；当前合格模板均已成功投递一次后，重新开始下一轮。当前存在两套及以上合格模板时，连续两次不得使用同一模板，包括模板轮换周期交界处；当前仅一套模板合格时允许重复。模板不设置独立开关、独立间隔或独立日上限。 | 固定规则 | A10-A 成功投递后，A10 场景间隔结束且 A10-A、A10-B 仍同时合格时，下一次只能选择 A10-B；两套均成功投递后开启新一轮。 |
| 15 | 事件去重 | 被动通知 | 同一个真实事件因系统重复回调时只生成一个候选；不同真实事件不去重。事件去重只解决重复回调，不替代被动通知间隔和上限。 | 固定规则，不作为后台参数 | 同一张截图产生 3 次回调只算一个事件；连续新增两张不同截图算两个事件。同一个 App 的一次安装产生多次广播只算一个事件；两个不同 App 分别安装算两个事件。电池持续处于同一状态只算一个事件，离开后再次进入该状态算新事件。 |
| 16 | 统一日上限 | 主动通知、被动通知 | 两类普通通知共用一个自然日总上限；当天所有成功投递的主动通知和被动通知合并计数。 | 后台自定义参数；默认值本轮不设定 | 统一日上限为 5 时，A01 投递 2 条、A03 投递 1 条、B01 投递 2 条后，当天全部主动和被动通知停止投递。 |
| 17 | 单场景日上限 | 每个普通通知场景 | 所有场景 ID 共用同一个单场景日上限参数值，但每个场景 ID 独立计数。某场景达到单场景日上限后，当天该场景下的全部模板停止参与；其他未达到单场景日上限的场景仍可参与。单场景日上限与统一日上限同时生效，任意一个达到限制即停止对应通知投递。 | 后台统一自定义一个单场景日上限参数；默认值本轮不设定 | 单场景日上限为 2 时，A01 当天成功投递 2 条后停止参与；A03 仍可继续参与，但全部普通通知累计达到统一日上限后也必须停止。 |
| 18 | 场景开关 | 每个普通通知场景 | 每个场景 ID 独立配置一个后台开关，开关统一控制该场景下的全部模板；模板不单独设置开关。关闭后，该场景及其全部模板均不参与候选。 | 后台自定义参数 | 关闭 B01“新 App 安装”场景后，B01-A 至 B01-D 均不参与候选，不影响 B02“其他 App 卸载残留”。 |
| 19 | 成功投递与计数 | 主动通知、被动通知 | 提交通知前确认系统通知权限和对应通知渠道可用，并成功调用 Android 系统通知接口后，视为成功投递。成功投递即同时计入统一日上限和对应场景日上限，并更新对应的主动场景间隔或被动通知间隔、模板轮换状态；主动通知成功后再移动主动检查起点。不以是否弹出横幅、用户是否看见或点击为判断依据。权限关闭、渠道关闭或通知创建失败时不计数，也不更新间隔、模板轮换状态或检查起点。 | 固定统计规则 | 系统已接收通知但用户没有点击，仍计入频控；通知权限关闭导致未投递时不计数，下一次主动检查仍从原起点开始。 |
| 20 | 日计数与清零 | 主动通知、被动通知 | 按手机当地自然日统计，当地时间进入次日 `00:00` 后，统一日计数和各场景日计数同时清零。 | 固定统计规则 | 常驻通知、Notification Cleaner 汇总通知和 FCM 可见通知不计入普通通知统一日上限或单场景日上限。 |

## 4. 通知栏与点击规则

| 序号 | 规则 | 适用对象 | 已确认内容 | 后台控制 / 默认值 | 案例或说明 |
|---:|---|---|---|---|---|
| 21 | 同场景覆盖与通知栏显示上限 | 当前通知栏中的普通通知 | 每个场景 ID 对应一个固定通知位置，同一场景的新普通通知直接更新或覆盖该场景旧通知；不同场景分别占用通知位置。后台控制普通通知最大可见数量，不同场景的新通知到达且已达到上限时，覆盖当前最早展示的一条普通通知。同场景更新成功后仍按本次成功投递正常计入对应间隔、统一日上限和单场景日上限。常驻通知、Notification Cleaner 汇总通知和 FCM 可见通知不占用该上限，也不会被普通通知覆盖。 | 后台自定义普通通知最大可见数量；默认值本轮不设定 | B03 任一新模板展示时覆盖通知栏中原有的 B03 通知；若通知栏上限为 3 且当前已有 3 个不同场景，第四个不同场景覆盖其中最早的一条。 |
| 22 | 统一广告点击链路 | 四类可见通知 | 用户点击任一可见通知，或点击常驻通知中的具体功能入口后，只执行一次广告请求与展示链路；广告关闭、加载失败、展示失败或无填充后，仍进入该通知对应的目标页面。广告外跳召回通知属于特例，点击后直接恢复外跳前任务，不再次触发广告。 | 固定规则 | 普通通知点击后广告无填充，仍进入场景目标页；广告外跳召回通知点击后直接恢复原任务，避免再次广告形成循环。 |
| 23 | 点击路由 | 四类可见通知 | 普通通知进入对应场景指定页面；常驻通知进入用户点击的具体功能入口；Notification Cleaner 汇总通知进入 Notification Cleaner；FCM 可见通知进入后台配置的目标页面。具体普通通知路由随每个场景逐项确认。 | 普通通知随场景固定；FCM 由后台配置 | 每类通知进入其对应目标页面。 |

## 5. 通知场景、模板、文案与路由

普通通知共 17 个场景组、52 套模板，其中主动通知 10 个场景、被动通知 7 个场景。一个场景对应一个触发来源或一组同源事件；同一场景可以配置多套模板，模板按附加条件进入候选池。

文案统一使用“真实数字或真实变化前置 + 明确空间损失或未完成状态 + 立即行动”的结构。能取得容量、数量、天数、电量或任务结果时必须展示真实值；只能确认一次性事件时可使用真实的“1 个 / 1 次”，不得生成随机数或虚构风险。English copy（英文文案）中的数量名词按真实值使用单复数，表内先以复数形式展示。

### 5.1 主动通知场景

| 顺序 / 场景 ID | 触发规则 | 模板及附加条件 | 中文文案 | English copy（英文文案） | 路由 | 案例 |
|---|---|---|---|---|---|---|
| A01｜垃圾清理 | 当前真实扫描结果中，App cache、Temporary files、Log files 和 Installation files 的可清理容量合计达到后台字段 `{junk_size_threshold}`；Empty folders 可作为候选，但容量按 0 计算。 | A01-A<br>取得真实 `{junk_size}` | 主文案：{junk_size} 垃圾正在占用空间，立即清理<br>CTA：立即清理 | Copy: {junk_size} of Junk Is Taking Up Space. Clean It Now<br>CTA: Clean Now | Junk Cleaner | 后台阈值设为 100 MB，当前仍有 680 MB 可处理垃圾，通知展示“680 MB 垃圾正在占用空间”。 |
| A01｜垃圾清理 | 同上 | A01-B<br>取得真实 `{junk_size}` | 主文案：发现 {junk_size} 可清理垃圾，马上释放空间<br>CTA：释放空间 | Copy: {junk_size} of Junk Found. Free Up Space Now<br>CTA: Free Up Space | Junk Cleaner | 扫描结果仍有 1.2 GB 垃圾，通知展示真实容量“1.2 GB”。 |
| A02｜综合清理候选 | 最近一次有效 Smart Clean 结果中，至少 2 个清理分类仍存在真实候选，且去重后的 `{cleanup_size}` 大于 0。 | A02-A<br>取得真实 `{category_count}` 与 `{cleanup_size}` | 主文案：{category_count} 类候选可释放 {cleanup_size}，立即查看<br>CTA：立即整理 | Copy: {category_count} Categories Could Free {cleanup_size}. Review Now<br>CTA: Review Now | Smart Clean | Junk 与 Screenshots 共 2 类候选，合计可复核 860 MB，通知展示两个真实值。 |
| A02｜综合清理候选 | 同上 | A02-B<br>取得真实 `{cleanup_size}` | 主文案：{cleanup_size} 可释放空间待确认，马上查看<br>CTA：查看建议 | Copy: {cleanup_size} Could Be Freed. Review It Now<br>CTA: See Suggestions | Smart Clean | Smart Clean 当前真实建议复核 2.4 GB，通知展示“2.4 GB”。 |
| A03｜低存储 | 当前设备可用存储空间少于后台字段 `{low_storage_threshold}`。可用空间恢复到该阈值及以上后，场景退出。 | A03-A<br>取得真实 `{free_space}` | 主文案：仅剩 {free_space}，立即腾出更多空间<br>CTA：释放空间 | Copy: Only {free_space} Left. Free Up Space Now<br>CTA: Free Up Space | Smart Clean | 后台阈值设为 10 GB，当前仅剩 8.6 GB，展示真实剩余空间；恢复到 12 GB 后场景退出。 |
| A03｜低存储 | 同上 | A03-B<br>取得真实 `{free_space}` | 主文案：{free_space} 可用空间，存储告急，马上清理<br>CTA：立即清理 | Copy: {free_space} Free. Storage Is Running Low. Clean Now<br>CTA: Clean Now | Smart Clean | 当前可用空间为 6 GB，通知直接展示“6 GB”。 |
| A03｜低存储 | 同上 | A03-C<br>取得真实 `{free_space}` 且 Smart Clean 可进入 | 主文案：只剩 {free_space}，别再让文件挤满存储<br>CTA：马上腾出空间 | Copy: Just {free_space} Left. Make Room Before Storage Fills Up<br>CTA: Make Room Now | Smart Clean | 当前剩余空间为 4.2 GB，点击进入 Smart Clean。 |
| A04｜长时间未检查存储 | 从最近一次 Smart Clean 成功扫描开始计算；从未成功扫描时从安装时间计算。只在满 1、3、7、15、30 天五个时间点形成候选；成功扫描后重新计算。 | A04-A<br>满 3 天 | 主文案：3 天没检查存储，立即看看新增占用<br>CTA：立即扫描 | Copy: 3 Days Without a Storage Check. See What Added Up Now<br>CTA: Scan Now | Smart Clean | 最近一次成功扫描距今满 3 天（72 小时），A04-A 参与本次候选。 |
| A04｜长时间未检查存储 | 同上 | A04-B<br>满 7 天 | 主文案：7 天没检查存储，马上查看空间变化<br>CTA：马上检查 | Copy: 7 Days Without a Check. Review Your Storage Now<br>CTA: Check Now | Smart Clean | 用户连续 7 天没有成功扫描，展示明确的“7 天”。 |
| A04｜长时间未检查存储 | 同上 | A04-C<br>满 15 天 | 主文案：15 天没扫描，立即检查新增文件<br>CTA：立即扫描 | Copy: 15 Days Without a Scan. Check New Files Now<br>CTA: Scan Now | Smart Clean | 用户第 15 天仍未成功扫描，本时间点只形成一次候选。 |
| A04｜长时间未检查存储 | 同上 | A04-D<br>满 30 天 | 主文案：30 天没检查，马上扫描积累内容<br>CTA：马上检查 | Copy: 30 Days Without a Check. Scan What Built Up Now<br>CTA: Check Now | Smart Clean | 用户第 30 天仍未成功扫描，进入 30 天模板池。 |
| A04｜长时间未检查存储 | 同上 | A04-E<br>满 1 天 | 主文案：1 天没检查存储，立即查看新增占用<br>CTA：立即检查 | Copy: 1 Day Without a Storage Check. See What Changed Now<br>CTA: Check Now | Smart Clean | 最近一次成功扫描距今满 1 天（24 小时），A04-E 参与本次候选。 |
| A05｜照片整理候选 | 最近一次有效分析中，仍存在文件未失效的重复、相似或模糊照片候选。 | A05-A<br>取得真实 `{duplicate_group_count}` | 主文案：{duplicate_group_count} 组重复照片占用额外空间，立即查看<br>CTA：查看重复项 | Copy: {duplicate_group_count} Duplicate Groups Are Using Extra Space. Review Now<br>CTA: Review Duplicates | Photos > Duplicates | 当前有 4 组重复照片，通知展示“4 组”。 |
| A05｜照片整理候选 | 同上 | A05-B<br>取得真实 `{similar_photo_count}` | 主文案：{similar_photo_count} 张相似照片待挑选，马上整理<br>CTA：挑选照片 | Copy: {similar_photo_count} Similar Photos Need Review. Choose the Best Now<br>CTA: Review Photos | Photos > Similar | 当前有 28 张相似照片，点击直达相似照片结果。 |
| A05｜照片整理候选 | 同上 | A05-C<br>取得真实 `{blurry_photo_count}` | 主文案：{blurry_photo_count} 张模糊照片正在占用空间，立即复核<br>CTA：立即复核 | Copy: {blurry_photo_count} Blurry Photos Are Taking Up Space. Review Now<br>CTA: Review Now | Photos > Blurry | 最近一次分析仍有 18 张模糊照片且文件存在。 |
| A05｜照片整理候选 | 同上 | A05-D<br>取得真实 `{photo_count}` | 主文案：{photo_count} 张照片待整理，马上开始筛选<br>CTA：查看照片 | Copy: {photo_count} Photos Are Ready to Sort. Start Now<br>CTA: Review Photos | Photos | 三类照片合计有 42 张真实候选，展示真实数量。 |
| A06｜截图积累 | 当前仍存在的截图数量达到后台字段 `{screenshot_count_threshold}`。 | A06-A<br>取得真实 `{screenshot_count}` | 主文案：{screenshot_count} 张截图越积越多，立即整理<br>CTA：整理截图 | Copy: {screenshot_count} Screenshots Are Piling Up. Clear Them Now<br>CTA: Review Screenshots | Photos > Screenshots | 后台阈值设为 20 张，当前存在 36 张截图，通知展示“36 张”。 |
| A06｜截图积累 | 同上 | A06-B<br>取得真实 `{screenshot_count}` 与 `{screenshot_size}` | 主文案：{screenshot_count} 张截图占用 {screenshot_size}，马上释放空间<br>CTA：立即复核 | Copy: {screenshot_count} Screenshots Use {screenshot_size}. Free Up Space Now<br>CTA: Review Now | Photos > Screenshots | 当前 36 张截图共占用 184 MB，两个真实值同时展示。 |
| A06｜截图积累 | 同上 | A06-C<br>取得真实 `{screenshot_count}` | 主文案：还有 {screenshot_count} 张截图未整理，立即检查<br>CTA：查看截图 | Copy: {screenshot_count} Screenshots Still Need Review. Check Them Now<br>CTA: Review Screenshots | Photos > Screenshots | 当前截图数达到阈值，本次随机到 A06-C。 |
| A07｜大视频 | 当前至少存在 1 个文件仍有效、大小达到后台字段 `{large_video_threshold}` 的视频。 | A07-A<br>取得真实 `{large_video_count}` 与 `{large_video_total_size}` | 主文案：{large_video_count} 个大视频占用 {large_video_total_size}，立即查看<br>CTA：查看大视频 | Copy: {large_video_count} Large Videos Use {large_video_total_size}. Review Now<br>CTA: Review Videos | Videos | 当前有 3 个大视频合计占用 4.6 GB，通知展示两个真实值。 |
| A07｜大视频 | 同上 | A07-B<br>取得真实 `{largest_video_size}` | 主文案：最大视频占用 {largest_video_size}，马上处理<br>CTA：查看视频 | Copy: Your Largest Video Uses {largest_video_size}. Check It Now<br>CTA: View Video | Videos | 当前最大视频为 1.8 GB，展示真实大小。 |
| A07｜大视频 | 同上 | A07-C<br>取得真实 `{compressible_video_count}` | 主文案：{compressible_video_count} 个大视频可压缩，立即节省空间<br>CTA：立即压缩 | Copy: {compressible_video_count} Large Videos Can Be Compressed. Save Space Now<br>CTA: Compress Now | Compress | 当前有 2 个视频支持压缩，点击直达 Compress。 |
| A08｜App 管理 | Usage access 可用，且至少满足一项：可管理 App 数量达到 `{app_count_threshold}`；单个 App 大小达到 `{large_app_threshold}`；App 未使用天数达到 `{unused_app_days}`。 | A08-A<br>取得真实 `{app_count}` | 主文案：{app_count} 个 App 正在占用存储，立即整理<br>CTA：整理 App | Copy: {app_count} Apps Are Using Storage. Review Them Now<br>CTA: Review Apps | Manage apps | 后台阈值为 80 个，当前可管理 App 为 92 个，通知展示“92”。 |
| A08｜App 管理 | 同上 | A08-B<br>取得真实 `{app_name}` 与 `{app_size}` | 主文案：{app_name} 占用 {app_size}，马上管理<br>CTA：立即管理 | Copy: {app_name} Uses {app_size}. Manage It Now<br>CTA: Manage Now | Manage apps > Size | 某 App 真实占用 2.1 GB，点击后按大小查看。 |
| A08｜App 管理 | 同上 | A08-C<br>取得真实 `{unused_app_count}` 与 `{unused_app_days}` | 主文案：{unused_app_count} 个 App 已 {unused_app_days} 天未使用，立即检查<br>CTA：查看 App | Copy: {unused_app_count} Apps Unused for {unused_app_days} Days. Review Now<br>CTA: Review Apps | Manage apps > Unused | 当前有 12 个 App 已 30 天未使用，展示两个真实值。 |
| A09｜重复联系人 | Contacts 权限可用，最近一次成功扫描仍存在真实重复联系人组。 | A09-A<br>取得真实 `{group_count}` | 主文案：{group_count} 组重复联系人让通讯录变乱，立即整理<br>CTA：整理联系人 | Copy: {group_count} Duplicate Contact Groups Are Cluttering Your List. Fix Them Now<br>CTA: Review Contacts | Contacts | 当前仍有 3 组重复联系人，点击进入联系人整理。 |
| A09｜重复联系人 | 同上 | A09-B<br>取得真实 `{duplicate_contact_count}` | 主文案：{duplicate_contact_count} 个重复联系人待合并，马上复核<br>CTA：立即复核 | Copy: {duplicate_contact_count} Duplicate Contacts Need Merging. Review Now<br>CTA: Review Now | Contacts | 扫描得到 8 个重复联系人，通知展示真实数量。 |
| A10｜版本更新提醒 | 当前安装的 Tidyvo `versionCode` 小于后台字段 `{latest_version_code}` 时进入主动场景池；当前版本已达到或超过该值，或后台关闭 A10 场景时退出。`{latest_version_code}` 与 `{latest_version_name}` 必须对应 Google Play 已可升级的同一正式版本。 | A10-A<br>取得真实 `{latest_version_name}` | 主文案：Tidyvo {latest_version_name} 已上线，立即更新体验新版<br>CTA：立即更新 | Copy: Tidyvo {latest_version_name} Is Available. Update Now<br>CTA: Update Now | Google Play > Tidyvo；Google Play App 不可用时使用浏览器打开同一商店页 | 当前安装版本为 v1.1.0，后台配置的最新正式版本为 v1.1.1，A10-A 参与主动候选；点击后打开 Tidyvo 的 Google Play 页。 |
| A10｜版本更新提醒 | 同上 | A10-B<br>取得真实 `{latest_version_name}` | 主文案：新版本 {latest_version_name} 已准备好，马上升级 Tidyvo<br>CTA：马上升级 | Copy: Version {latest_version_name} Is Ready. Upgrade Tidyvo Now<br>CTA: Upgrade Now | Google Play > Tidyvo；Google Play App 不可用时使用浏览器打开同一商店页 | 同一版本更新状态下，A10-A 与 A10-B 同时合格，本次等概率随机选择一套。 |

### 5.2 被动通知场景

| 顺序 / 场景 ID | 触发规则 | 模板及附加条件 | 中文文案 | English copy（英文文案） | 路由 | 案例 |
|---|---|---|---|---|---|---|
| B01｜新 App 安装 | 检测到其他 App 安装完成且不是更新替换时进入一次场景池；排除 Tidyvo 自身。 | B01-A<br>取得真实 `{app_name}` 与 `{app_size}` | 主文案：{app_name} 已占用 {app_size}，立即查看<br>CTA：管理 App | Copy: {app_name} Now Uses {app_size}. Check It Now<br>CTA: Manage App | Manage apps | 用户安装 Spotify，系统取得真实名称和 245 MB 占用后展示两个真实值。 |
| B01｜新 App 安装 | 同上 | B01-B<br>无法安全取得 App 名称或大小 | 主文案：1 个新 App 已安装，马上检查存储占用<br>CTA：查看 App | Copy: 1 New App Installed. Check Its Storage Use Now<br>CTA: View App | Manage apps | 安装事件有效但名称或大小不可用时，使用真实事件数“1”。 |
| B01｜新 App 安装 | 同上 | B01-C<br>取得真实 `{installer_count}` | 主文案：{installer_count} 个安装包仍在占用空间，立即删除<br>CTA：删除安装包 | Copy: {installer_count} Installers Are Still Taking Up Space. Remove Them Now<br>CTA: Remove Installers | Junk Cleaner > Installation files | 安装完成后在可读存储中发现 1 个对应安装包，进入清理路由。 |
| B01｜新 App 安装 | 同上 | B01-D<br>取得真实 `{installer_size}` | 主文案：{installer_size} 安装包仍留在手机里，马上删除<br>CTA：立即删除 | Copy: A {installer_size} Installer Is Still on Your Phone. Remove It Now<br>CTA: Remove Now | Junk Cleaner > Installation files | 安装包真实大小为 186 MB，通知展示该容量。 |
| B02｜其他 App 卸载残留 | 检测到其他 App 完整卸载且不是更新替换时进入一次场景池；已确认真实残留时使用对应容量模板，尚未确认到残留时使用检查模板。 | B02-A<br>取得真实 `{app_name}` 与 `{leftover_size}` | 主文案：{app_name} 已卸载，{leftover_size} 残留仍占空间<br>CTA：清理残留 | Copy: {app_name} Was Removed, but {leftover_size} Remains. Clean It Now<br>CTA: Clean Leftovers | Junk Cleaner | 用户卸载某 App 后确认存在 240 MB 真实残留，并且仍可取得 App 名称。 |
| B02｜其他 App 卸载残留 | 同上 | B02-B<br>尚未确认到真实残留 | 主文案：1 个 App 已卸载，立即检查是否有残留<br>CTA：检查残留 | Copy: 1 App Was Removed. Check for Leftover Files Now<br>CTA: Check Leftovers | Junk Cleaner | 检测到 1 次真实完整卸载，但尚未确认到对应残留；通知只提示检查，不描述已发现残留或虚构容量。 |
| B02｜其他 App 卸载残留 | 同上 | B02-C<br>取得真实 `{leftover_size}`，App 名称不可用 | 主文案：{leftover_size} 卸载残留还没清理，马上删除<br>CTA：删除残留 | Copy: {leftover_size} of Uninstall Leftovers Remains. Remove It Now<br>CTA: Remove Leftovers | Junk Cleaner | 已确认真实残留总量为 320 MB，但无法安全展示 App 名称，通知只展示真实容量。 |
| B03｜新增媒体 | 检测到新截图时立即进入场景池；其他新照片不进入本场景；新视频只有在达到大视频阈值时进入。每一张新截图都作为独立真实事件。 | B03-A<br>检测到 1 张新截图且文件仍存在 | 主文案：1 张新截图已保存，立即决定是否保留<br>CTA：查看截图 | Copy: 1 New Screenshot Saved. Decide Whether to Keep It Now<br>CTA: View Screenshot | Photos > Screenshots | 用户保存一张截图后，本次截图事件进入场景池。 |
| B03｜新增媒体 | 同上 | B03-B<br>检测到 1 张新截图且文件仍存在 | 主文案：刚新增 1 张截图，别让截图继续堆积<br>CTA：立即复核 | Copy: 1 Screenshot Just Added. Review It Before They Pile Up<br>CTA: Review Now | Photos > Screenshots | 同一截图事件的 B03-A、B03-B 均合格，本次随机选择其中一套。 |
| B03｜新增媒体 | 同上 | B03-C<br>取得真实 `{new_video_size}` 且达到 `{large_video_threshold}` | 主文案：新增视频占用 {new_video_size}，马上查看<br>CTA：查看视频 | Copy: A New Video Uses {new_video_size}. Check It Now<br>CTA: View Video | Videos | 新增视频真实大小为 1.6 GB 且达到配置阈值，点击进入 Videos。 |
| B04｜充电与电量事件 | 设备开始充电、首次达到充满状态或电量从阈值上方降到后台字段 `{battery_low_threshold}` 及以下时进入对应模板池。 | B04-A<br>开始充电、Charging Animation 已启用并取得 `{battery_level}` | 主文案：电量 {battery_level}，充电已开始，立即查看状态<br>CTA：查看状态 | Copy: Battery at {battery_level}. Charging Started. Check Status Now<br>CTA: View Status | Charging Animation | 设备在 42% 时开始充电，动效已启用，通知展示真实电量。 |
| B04｜充电与电量事件 | 同上 | B04-B<br>开始充电、Charging Animation 未启用并取得 `{battery_level}` | 主文案：电量 {battery_level}，充电已开始，马上设置动效<br>CTA：选择动效 | Copy: Battery at {battery_level}. Charging Started. Choose an Animation Now<br>CTA: Choose Animation | Charging Animation | 设备在 28% 时开始充电但未启用动效，点击进入设置。 |
| B04｜充电与电量事件 | 同上 | B04-C<br>本次插电首次确认充满 | 主文案：电量 100%，本次充电已完成，立即查看详情<br>CTA：查看详情 | Copy: Battery at 100%. Charging Complete. View Details Now<br>CTA: View Details | Battery info | 同一次持续插电期间首次达到 FULL，只形成一次候选。 |
| B04｜充电与电量事件 | 同上 | B04-D<br>电量首次降到阈值并取得真实 `{battery_level}` | 主文案：仅剩 {battery_level} 电量，立即检查电池状态<br>CTA：立即检查 | Copy: Only {battery_level} Battery Left. Check Its Status Now<br>CTA: Check Now | Battery info | 后台阈值设为 20%，电量由 21% 降到 20% 时进入一次；持续为 20% 不重复产生事件。 |
| B05｜电池异常状态 | Android 系统 Battery health 从正常或未知切换为明确异常状态时进入；仅使用系统真实状态。 | B05-A<br>异常状态可安全映射为 `{battery_status}` | 主文案：检测到 1 项电池异常：{battery_status}，立即查看<br>CTA：检查状态 | Copy: 1 Battery Issue Detected: {battery_status}. Check It Now<br>CTA: Check Status | Battery info | 系统状态从 GOOD 变为 OVERHEAT，并安全展示对应用户文案。 |
| B05｜电池异常状态 | 同上 | B05-B<br>确认异常但不展示具体诊断 | 主文案：1 项电池异常需要处理，马上检查<br>CTA：立即检查 | Copy: 1 Battery Issue Needs Attention. Check It Now<br>CTA: Check Now | Battery info | 厂商只返回异常枚举、不适合直接翻译具体原因时使用通用模板。 |
| B06｜广告外跳召回 | 用户从 Tidyvo 的有效任务点击广告并成功跳到外部页面时，立即进入一次场景池；不设置场景延迟，原任务必须仍可恢复。 | B06-A<br>原任务有效 | 主文案：糟糕！不小心点到广告？点击返回清理<br>CTA：返回 | Copy: Oops! Accidentally Clicked an Ad? Tap Here to Return to Your Cleaning<br>CTA: Return | 恢复外跳前任务 | 用户从清理任务跳到外部广告页后立即进入候选；点击通知直接恢复原任务，不再次请求广告。 |
| B06｜广告外跳召回 | 同上 | B06-B<br>原任务有效 | 主文案：糟糕！点击返回 Tidyvo<br>CTA：返回应用 | Copy: Oops! Tap to Return to Tidyvo<br>CTA: Go Back | 恢复外跳前任务 | 外跳成功且原任务仍可恢复，本次随机到竞品同类短文案。 |
| B06｜广告外跳召回 | 同上 | B06-C<br>原任务有效 | 主文案：清理还没完成，点击立即返回<br>CTA：继续清理 | Copy: Your Cleaning Is Still Waiting. Tap to Return Now<br>CTA: Continue Cleaning | 恢复外跳前任务 | 原任务仍有效时展示未完成状态；点击后返回外跳前任务。 |
| B07｜后台任务结果 | 用户主动开始任务后离开 Tidyvo，任务在后台得到真实成功、部分成功或失败终态时进入；用户仍在前台时不展示。 | B07-A<br>扫描成功并取得真实 `{analyzed_count}` | 主文案：扫描完成：已分析 {analyzed_count} 项，立即查看结果<br>CTA：查看结果 | Copy: Scan Complete: {analyzed_count} Items Analyzed. View Results Now<br>CTA: View Results | 对应扫描结果页 | 用户离开后 Smart Clean 扫描完成并真实分析 1,248 项；无清理候选时仍可如实展示扫描完成结果。 |
| B07｜后台任务结果 | 同上 | B07-C<br>清理成功或部分成功并取得 `{deleted_count}` 与 `{freed_size}` | 主文案：已清理 {deleted_count} 项、释放 {freed_size}，立即查看结果<br>CTA：查看结果 | Copy: {deleted_count} Items Cleaned, {freed_size} Freed. View Results Now<br>CTA: View Results | Cleanup report | 删除结束并重新查询后确认清理 18 项、实际释放 860 MB，通知展示两个真实值。 |
| B07｜后台任务结果 | 同上 | B07-D<br>视频压缩成功并取得 `{saved_size}` | 主文案：已节省 {saved_size}，立即查看压缩结果<br>CTA：查看结果 | Copy: {saved_size} Saved. View the Compression Result Now<br>CTA: View Results | Compression report | 视频在后台压缩成功并确认节省 420 MB，输出文件仍有效。 |
| B07｜后台任务结果 | 同上 | B07-E<br>取得真实 `{failed_video_count}` 且无有效输出 | 主文案：{failed_video_count} 个视频压缩失败，马上重试<br>CTA：重新压缩 | Copy: {failed_video_count} Video Compression Tasks Failed. Try Again Now<br>CTA: Compress Again | Compress | 后台有 1 个视频压缩真实失败，不使用成功话术。 |

## 6. 后台字段

| 字段 | 适用场景 | 口径 |
|---|---|---|
| `active_poll_interval_minutes` | 全部主动场景 | 主动场景轮询周期；默认 2 分钟。轮询本身不计入通知次数，也不更新时间状态。 |
| `default_interval_minutes` | 全部主动场景 | 主动场景成功投递间隔；默认 15 分钟。所有主动场景使用同一时长参数，但每个场景 ID 独立计时，同一场景下的全部模板共用该场景计时。 |
| `junk_size_threshold` | A01 | 垃圾清理进入阈值。 |
| `low_storage_threshold` | A03 | 低存储进入阈值；可用空间恢复到该值及以上时退出。 |
| `screenshot_count_threshold` | A06 | 截图积累进入阈值。 |
| `large_video_threshold` | A07、B03 | 大视频大小阈值，主动与被动共用。 |
| `app_count_threshold` | A08 | 可管理 App 数量阈值。 |
| `large_app_threshold` | A08 | 单个 App 大小阈值。 |
| `unused_app_days` | A08 | App 未使用天数阈值。 |
| `battery_low_threshold` | B04 | 低电量事件阈值。 |
| `latest_version_code` | A10 | Google Play 已可升级的最新正式版本 `versionCode`；本机版本低于该值时版本更新场景成立。 |
| `latest_version_name` | A10 | 与 `{latest_version_code}` 对应的对外版本名，用于通知文案真实展示。 |

长时间未检查固定为 1 / 3 / 7 / 15 / 30 天。被动通知间隔、统一日上限、单场景日上限、场景开关、展示时间和通知栏显示上限统一按本文第 1–4 章执行。

## 7. 普通通知埋点

本节仅统计本文主动通知和被动通知场景。目标是按场景和文案模板查看通知展示量、点击量及通知带来的目标操作转化量。

### 7.1 埋点事件

| 事件名 | 中文含义 | 上报时机 |
|---|---|---|
| `local_noti_show` | 通知展示 | 按第 19 条规则成功调用 Android 系统通知接口后上报。该事件代表通知已成功提交到系统通知栏，不代表用户一定肉眼看见。 |
| `local_noti_click` | 通知点击 | 用户点击通知并开始执行对应跳转时上报。 |
| `local_noti_conversion` | 通知转化 | 用户由本次通知进入目标功能，并在本次进入链路中成功完成清理、压缩或该场景对应的目标操作时上报。 |

### 7.2 公共参数

| 参数 | 示例 | 口径 |
|---|---|---|
| `scene_id` | `A01` | 本次通知对应的场景 ID。 |
| `template_id` | `A01-A` | 本次实际展示的文案模板 ID。 |
| `notification_id` | `A01_1730000000000` | 每次成功投递通知时生成的唯一通知实例编号，用于串联展示、点击与转化。 |
| `target` | `junk_cleaner` | 本次通知点击后进入的目标功能。 |

### 7.3 实例编号与转化归因

1. 每次成功投递普通通知时生成一个新的 `notification_id`；同一场景更新或覆盖旧通知时也必须重新生成。
2. 第 21 条规定的固定通知位置用于 Android 通知栏更新；埋点使用的 `notification_id` 用于区分每次实际投递，两者不是同一个字段。
3. 点击通知时，将本次 `scene_id`、`template_id`、`notification_id` 和 `target` 继续传入目标页面；中间经过广告链路时不得丢失或替换。
4. 只有用户通过本次通知进入目标功能，并在本次进入链路中成功完成对应目标操作，才上报 `local_noti_conversion`。用户以后从首页或其他入口重新进入产生的操作，不归因给此前通知。
5. 同一次通知实例的同一目标操作只上报一次 `local_noti_conversion`，避免页面重建或重复回调造成重复统计。

### 7.4 数据口径

| 指标 | 计算方式 |
|---|---|
| 展示量 | `local_noti_show` 事件数 |
| 点击量 | `local_noti_click` 事件数 |
| 点击率 | 点击量 ÷ 展示量 |
| 转化量 | `local_noti_conversion` 事件数 |
| 通知转化率 | 转化量 ÷ 展示量 |

以上指标必须支持按 `scene_id` 和 `template_id` 分别查看，用于对比不同通知场景和文案模板的实际效果。

## 8. 埋点验收

| 序号 | 验收项 | 验收标准 |
|---:|---|---|
| 1 | 三个事件可接收 | 调试环境能够分别收到 `local_noti_show`、`local_noti_click` 和 `local_noti_conversion`。 |
| 2 | 公共参数完整 | 三个事件均包含有效的 `scene_id`、`template_id`、`notification_id` 和 `target`。 |
| 3 | 实例可串联 | 同一次通知的展示、点击与转化使用同一个 `notification_id`；新一次投递使用新的 `notification_id`。 |
| 4 | 场景与模板可区分 | 数据能够分别统计 17 个普通通知场景及其不同文案模板。 |
| 5 | 转化归因正确 | 未点击对应通知，或从首页及其他入口重新进入后完成的操作，不得计为该通知实例的转化。 |
