旧通知执行方案
旧通知执行方案返回资料中心

Tidyvo 基于线上 v1.0.5 的竞品同构通知系统具体执行方案#

产品:Tidyvo: Deep Storage Cleaner(桌面名称:Tidyvo Cleaner)
包名:com.tidyvo.cleaner
当前线上基线:v1.0.5;本方案不擅自指定下一 App 版本号,正式启动新版本时再写入对应 PRD
方案日期:2026-08-13
竞品基线:Photo Recovery V1.0.3
配置真源:Tidyvo 自有中台;FCM 负责消息送达与配置刷新
产品现状:Notification Cleaner 已在上一线上版本加入,本方案按现有能力继续配置,不重复定义为新增功能 协作边界:本文只定义产品需求、中台规则、通知文案和验收口径,不代表实现状态;Codex 不开发业务代码,具体实现由开发团队基于线上 v1.0.5 代码完成

1. 执行结论#

Tidyvo 按竞品相同的系统结构执行:

自有中台下发策略、素材和灰度
→ 客户端保存 Offline_A / Online_B 或远程策略组
→ Service / Job / WorkManager / Alarm / FCM 维持调度和恢复入口
→ 时间窗口内按全局间隔循环尝试
→ 检查全局上限、通知栏数量和单素材频控
→ 从当前可用场景中选择通知
→ 本地通知或 FCM 展示
→ 统一跳板记录点击并进入 Tidyvo 对应功能
→ 在启动、功能完成和退出节点承接现有广告链路

“全盘复刻竞品”指:完整保留竞品已确认的调度模型、两套策略、17 个通知 ID、四类通知、特殊通知属性、后台恢复链、Notification Cleaner 和广告转化结构。

结合 Tidyvo 产品时,只做必要的业务语义替换:竞品的照片/视频/文档“恢复”场景,映射为 Tidyvo 已具备的照片整理、视频压缩、私密空间、联系人、To clean 和通知清理场景;不下发 Tidyvo 实际无法承接的恢复承诺。

1.1 先看懂竞品方案里的三个概念#

概念 白话含义 竞品中的例子 Tidyvo 中的例子
通知触达系统 App 主动给用户发送提醒,把用户召回 App “发现可恢复照片”“存储空间不足” “发现重复照片”“有截图可以清理”
Notification Cleaner(通知清理功能) 获得系统通知使用权后,帮助用户隐藏和整理其他 App 的通知 隐藏非白名单普通通知,并在竞品内保存通知历史 Tidyvo 现有 Notification Cleaner,作为通知 ID 17 的落地页
FCM(Firebase 云消息服务) 服务端向手机发送消息的通道,不是一种通知类型 服务端通知竞品立即展示消息,或通知客户端刷新配置 中台发即时通知,或提醒 Tidyvo 拉取最新版通知配置

例如:Tidyvo 发出“发现 20 张重复照片”属于通知触达;Tidyvo 把其他 App 的普通通知隐藏并放进通知历史,属于 Notification Cleaner。两套能力互相联动,但不是一回事。

2. 当前能力基线#

模块 Tidyvo v1.0.5 现有/已确认能力 本方案使用方式
Home 存储状态、Smart Clean、六类媒体入口 综合召回、扫描、存储不足落地页
Duplicate photos 重复照片选择 照片整理场景
Similar photos 相似照片选择 照片整理场景
Blurry photos 模糊照片清理 照片整理场景
Screenshots 截图列表和清理 截图轮询与截图事件场景
Large photos 大照片复核 大文件/空间场景
Large videos 大视频复核 大文件/空间场景
To clean 用户选中内容的删除前汇总 待处理召回场景
Compress 视频压缩 视频场景
Contacts 重复联系人整理 联系人场景
Private Space 私密内容入口 隐私内容召回场景
Charging Animation 充电动画与后台通知 事件通知与高优先级展示能力复用
Storage Widget 桌面组件 长期曝光和回访入口
Records 操作历史 已处理内容召回场景
Notification Cleaner 已上线的通知清理、隐藏和历史能力 竞品 ID 17 和常驻监听链
FCM / 中台 按本方案补齐 Token、配置和消息闭环 即时通知、配置刷新和恢复入口

3. 后台策略组#

3.1 竞品同构基线#

Offline_A(竞品较低频策略)和Online_B(竞品高频策略)是竞品 APK 中内置的两套兜底参数,不是联网/离线状态。中台把某个用户分到哪组,客户端就按哪组参数执行。

字段 Offline_A Online_B 白话含义与例子
normal_enabled(普通通知总开关) true true 是否允许生成全部普通通知;关闭后,重复照片、截图、大文件等普通提醒都不再生成
upper_limit(普通通知总上限) 5 99 一个统计周期内最多生成多少条普通通知;例如 Online_B 最多99条
interval_time_minutes(全局最短间隔) 30 2 两次循环尝试至少间隔多久;Online_B 每2分钟可以尝试一次,不代表每2分钟必定展示
repetitions(同文案重复次数) 1 3 同一句通知文案最多连续使用几次;达到次数后换同一场景的其他文案
continuous_ntf_num(单轮连续数量) 未确认 12 一轮最多连续安排多少条;竞品 Online_B 内置值为12
ntf_cooling_time_minutes(单轮冷却时间) 未确认 2 一轮结束后至少等待多久再进入下一轮;Online_B 为2分钟
max_visible_ntf(通知栏最大可见数) 未确认 5 通知栏里竞品自身通知达到5条时,先不继续增加
android_16_max_visible(Android 16 可见上限) 未确认 1 Android 16 单独最多保留1条竞品自身通知
ad_ntf_upper_limit(广告通知上限) -1 -1 -1 表示竞品客户端不限制广告通知总数,不是发送负一条

未确认值不得编造成竞品事实。Tidyvo 后台字段保留 null,由远程策略显式填写;不因为未确认而删除能力。

3.2 Tidyvo 首次发布配置#

首次发布必须同时建立 Offline_A 和 Online_B,两组均可直接分配用户。中台必须支持按以下条件分组:

  • 首个支持本方案的 App 版本及以上;具体版本号在常老大正式启动下一版本时写入对应 PRD;
  • 国家/地区;
  • App 当前语言;
  • Android 版本;
  • 厂商;
  • 安装时长;
  • 最后活跃时间;
  • Notification Cleaner 授权状态;
  • 远程百分比。

发布配置:

字段 初始值 白话含义与例子
master_switch(整套系统总开关) true Tidyvo 中台增加的最高层开关;关闭后整套通知触达停止
emergency_stop(紧急停发开关) false Tidyvo 中台增加的紧急按钮;线上通知异常时设为 true,立即停止生成新通知
strategy_group(策略组) Offline_A 或 Online_B 决定该用户使用竞品低频参数还是高频参数
start_time / end_time(发送时段) 08:00 / 21:30 只在用户手机当地时间08:00至21:30之间尝试普通通知
timezone_mode(时区方式) device_local 按用户手机当前时区判断发送时段
min_install_age_minutes(安装时长门槛) 5 安装不足5分钟时不进入竞品通知循环
require_post_notifications(要求发通知权限) true 用户没允许 Tidyvo 发通知时,不展示普通通知
require_screen_on(要求亮屏) 后台可配 开启后,只在屏幕亮起时构造对应通知
require_device_unlocked(要求已解锁) 后台可配 开启后,锁屏状态不构造对应通知
require_portrait(要求竖屏) 后台可配 开启后,只在手机竖屏状态构造对应通知
future_when_days(通知时间偏移) 非小米 365 竞品在非小米设备把通知对象的 when 时间设为当前时间加365天,Tidyvo按同一属性复刻
fallback_locale(文案兜底语言) en 当前语言没有可用文案时,改用同一通知 ID 的英文文案

3.3 竞品开关是怎样一层层控制的#

Tidyvo 中台 master_switch(整套系统总开关)/ emergency_stop(紧急停发)
→ 竞品 normal_enabled(普通通知总开关)
→ 场景 enabled(单个通知 ID 开关)
→ 模板 enabled(单句通知文案开关)
操作 实际结果 例子
关闭普通通知总开关 全部 normal_ntf(普通通知)停止 重复照片、截图、存储不足等普通提醒全部不发
关闭单场景开关 只停止一个通知 ID 关闭 ID 6 后,只是不再发截图整理提醒
关闭单模板开关 只停用一句文案 停用“立即清理截图”,同场景仍可选择其他截图文案
关闭 Notification Cleaner 的“通知隐藏”开关 停止隐藏其他 App 的通知 不影响 Tidyvo 是否给用户发送普通提醒

竞品已确认的是“普通通知总开关+单素材开关”两层控制;master_switch 和 emergency_stop 是 Tidyvo 为方便中台统一控制而增加的最上层开关。

上面的层级以普通通知为例;ad_ntf(广告/运营通知)、res_ntf(大样式通知)、filter_ntf(常驻通知)按竞品结构分别保留自己的类型开关。

4. 统一落地页契约#

中台对外使用以下产品级枚举;开发团队负责映射到线上 v1.0.5 的真实内部路由。本文不以本地 v1.0.0 代码中的路由名称判断线上实现。未知值、参数缺失、当前页面不存在或权限不足时回退 Home。

中台路由 Tidyvo 落地页 必要参数 无数据/无权限降级
home Home 无 Home
smart_clean Smart Clean 结果或扫描 无 无有效缓存时先扫描
duplicates Duplicate photos 无 无权限先走媒体权限;无结果显示空态
similar Similar photos 无 同上
blurry Blurry photos 无 同上
screenshots Screenshots 无 同上
large_photos Large photos 无 同上
large_videos Large videos 无 同上
to_clean To clean 无 为空时显示现有空态
compress Compress 无 无视频权限先授权
contacts Contacts 无 无联系人权限先授权
private_space Private Space 无 进入现有解锁链
charging Charging Animation 无 进入现有说明页
widget Storage Widget 无 进入现有安装说明页
records Records 无 无记录显示现有空态
notification_cleaner Notification Cleaner 无 无通知使用权进入现有授权链
notification_access Notification Cleaner 权限说明 无 打开系统通知使用权设置
settings_notifications Settings 通知区域 无 Settings

5. 17 个通知 ID 的 Tidyvo 具体配置#

5.1 总表#

ID Tidyvo 场景 触发类型 触发条件 路由 单素材上限 单素材间隔 优先级
1 首页综合召回 轮询 已安装满5分钟,通知权限有效 home 5 15分钟 30
2 重复/相似照片 轮询 最近扫描存在重复或相似照片;无缓存时允许通用素材 duplicates / similar 5 15分钟 70
3 大视频与压缩 轮询 存在大视频或最近使用过 Compress;无缓存时允许通用素材 large_videos / compress 3 15分钟 65
5 私密空间 轮询 Private Space 可用 private_space 3 15分钟 45
6 截图整理 轮询 最近扫描存在截图;无缓存时允许通用素材 screenshots 2 15分钟 75
7 联系人整理 轮询 Contacts 功能可用 contacts 3 15分钟 50
8 已处理内容/记录 轮询 Records 存在历史;无记录时回退 Home records 2 15分钟 35
9 Smart Clean 主池 轮询 Smart Clean 可用;允许固定宣称素材 smart_clean 5 15分钟 80
10 模糊照片提醒 轮询 最近扫描存在模糊照片;无缓存时允许通用素材 blurry 3 15分钟 72
11 To clean 待确认 轮询 To clean 有项目;无项目时使用首页综合素材 to_clean / home 5 15分钟 90
12 长时间未扫描 轮询 距离最近一次扫描达到后台变量 {days};首次无记录用安装时长 smart_clean 3 15分钟 55
13 长时间未清理/容量 轮询 距离最近一次成功清理达到 {days},或存储达到 {used_percent} smart_clean 3 15分钟 85
17 Notification Cleaner 轮询 已授权且本地通知历史存在记录;或使用通用通知过载素材 notification_cleaner 2 15分钟 88
18 大文件/空间不足 轮询 存在大照片/大视频,或系统剩余空间低 large_videos / large_photos 3 15分钟 95
14 新增媒体/文件事件 事件 MediaStore 观察到新增媒体或大文件;用 Tidyvo 等价事件替换竞品 APK 安装包事件 smart_clean 后台可配 事件触发 78
15 删除后残留待确认 事件 删除/清理结束后 To clean 或扫描仍有待处理项;用 Tidyvo 等价事件替换竞品卸载残留事件 to_clean 后台可配 事件触发 92
16 新截图事件 事件 MediaStore 观察到新截图,达到事件阈值 screenshots 后台可配 事件触发 82

5.2 选择顺序#

每次循环只选择当前优先级最高的一条合格素材:

ID 18 空间/大文件
→ ID 15 删除后仍有待处理
→ ID 11 To clean
→ ID 17 Notification Cleaner
→ ID 13 长时间未清理
→ ID 16 新截图
→ ID 9 Smart Clean
→ ID 14 新增媒体
→ ID 6 截图
→ ID 10 模糊照片
→ ID 2 重复/相似照片
→ ID 3 大视频/压缩
→ ID 12 长时间未扫描
→ ID 7 联系人
→ ID 5 私密空间
→ ID 8 Records
→ ID 1 首页综合召回

这个顺序是 Tidyvo 的业务映射规则,不声称是竞品代码已确认的选择顺序;它只负责在竞品同构调度器中决定 Tidyvo 场景优先级。

5.3 逐 ID 执行规则#

ID 准入与数据选择 排除/停发 模板池 点击与广告承接
1 安装满5分钟、通知权限有效、当前没有更高优先级场景;不依赖扫描数据 总开关关闭、达到全局或素材上限、超出时段 TIDY_01_* 进入 Home;按线上广告层执行通知唤醒的启动广告判断
2 优先选择有最新结果且容量更大的 Duplicate 或 Similar;无最新结果仍可使用无变量素材 媒体权限不可用时允许展示,但点击后先进入现有权限链;同素材冷却时换素材 TIDY_02_* 进入 Duplicate/Similar;进入列表后承接现有原生广告,操作结果承接现有插屏判断
3 有大视频时进入 Large Videos;否则进入 Compress;允许无变量通用素材 当前设备不支持对应视频处理时回退 Home TIDY_03_* 大视频列表或 Compress;压缩完成/退出按现有广告层请求广告
5 Private Space 为线上可用功能时准入;无需读取私密内容数量 功能被中台关闭或设备不可用时不选该 ID TIDY_05_* 进入 Private Space 现有解锁链;禁止通知携带私密文件信息
6 有截图扫描结果时优先;没有结果时仍可使用无变量素材 场景关闭、素材冷却或全局上限达到时停发 TIDY_06_* 进入 Screenshots;列表和操作结果承接现有广告逻辑
7 Contacts 功能存在即可;不要求预先读取联系人内容 功能关闭或设备不支持联系人能力时不发 TIDY_07_* 进入 Contacts;无权限走现有授权,通知和中台不携带联系人数据
8 Records 有记录时优先;无记录可使用无变量素材但点击回退 Home Records 功能关闭时不发 TIDY_08_* 有记录进入 Records,无记录进入 Home;退出按现有广告逻辑判断
9 作为 Smart Clean 主召回池始终可参与;动态素材与固定宣称素材均可选 只受总开关、策略组、全局/素材频控和通知栏数量限制 TIDY_09_* 进入 Smart Clean;若需扫描先显示扫描,再进入结果与广告链
10 有 Blurry 结果时优先;无结果可用无变量素材 媒体能力不可用时点击先走权限链 TIDY_10_* 进入 Blurry;操作完成和退出承接现有广告逻辑
11 To clean 有项目时填 {count};为空时改用无变量素材并把路由设为 Home 用户完成删除、清空选择或本地数据失效后变量素材立即失效 TIDY_11_* 有项目进入 To clean;删除完成进入现有报告并承接完成广告
12 最近扫描时间存在时计算 {days};没有记录时按安装时长计算并使用无变量素材 用户完成新扫描后,本轮旧变量素材失效,下一循环重新计算 TIDY_12_* 进入 Smart Clean 并启动/展示扫描结果
13 最近清理天数和存储使用率二选一;优先使用可用的动态变量,否则用无变量素材 用户完成清理后重新计算,不要求当天永久停发 TIDY_13_* 进入 Smart Clean;结果、清理完成和退出承接广告链
17 Notification Cleaner 已授权时读取本地历史数量;无数量或未授权时使用无变量素材 Notification Cleaner 中台开关关闭时停发;权限失效时路由改为权限说明 TIDY_17_* 已授权进入 Notification Cleaner,未授权进入现有授权链;退出请求现有 Notification Cleaner 广告场景
18 优先用真实剩余空间、扫描容量或最大类目;没有变量时使用 Large File Alert 存储状态恢复后重新计算,不补发已过期动态素材 TIDY_18_* 大视频优先,其次大照片,再次 Smart Clean;列表与退出承接广告逻辑
14 MediaStore 观察到新增媒体;达到中台配置的大小/数量阈值立即建立候选 事件过期、文件已不存在或已被处理时取消 TIDY_14_* 进入 Smart Clean;这是 Tidyvo 对竞品“安装包事件”的等价场景
15 删除/清理结束后重新扫描,仍存在 To clean 或推荐项时触发 剩余项目为0、用户已再次处理或事件超过有效期时取消 TIDY_15_* 进入 To clean;这是 Tidyvo 对竞品“卸载残留事件”的等价场景
16 观察到新截图并达到中台配置阈值;可选择固定100+素材 截图已删除、场景过期或达到素材上限时取消 TIDY_16_* 进入 Screenshots;列表和操作结果承接广告逻辑

5.4 统计周期和过期规则#

项目 规则
全局上限周期 按设备当地时间 00:00–23:59 统计,跨日重置
单素材上限周期 与全局周期一致;后台可为事件素材设置独立生命周期
轮询素材有效期 无变量素材默认到本统计周期结束;动态变量素材每次发送前重新校验
事件素材有效期 ID 14、15、16 默认2小时,后台可配置
通知栏数量 发送前读取 Tidyvo 当前活动通知数;达到策略上限时等待下一循环
用户清除通知 记录 notification_dismiss;常驻通知按竞品恢复链处理,普通通知继续服从下一循环
Force Stop 不承诺系统强停后仍能恢复;用户重新打开 App 后补齐调度链

5.5 广告承接规则#

节点 需求
通知冷启动 进入统一跳板并完成初始化后,调用线上广告层已有的启动广告判断;广告不可用时直接落地,不阻断通知点击
通知热启动 不重新创建业务状态;调用线上热启动广告判断后进入目标页
扫描完成 ID 2、6、9、10、12、13、18 进入扫描结果时请求现有结果广告场景
操作完成 删除、压缩、联系人合并等完成后请求线上现有完成广告场景
页面退出 Smart Clean、媒体列表、Compress、Contacts、Records、Notification Cleaner 退出时请求线上对应退出广告场景
原生广告 复用线上列表/结果页已有原生广告位置,不因通知入口重复插入第二套原生位
去重 同一次通知点击只产生一次启动广告判断和一次落地,不因 Activity 重建重复请求

5.6 每轮决策顺序#

客户端每次被任一调度入口唤起后,按固定顺序判断:

读取最后一份校验通过的中台配置
→ 检查 master_switch / emergency_stop
→ 检查当前 App 版本是否命中发布范围
→ 选择用户所属策略组
→ 普通通知检查 normal_enabled(普通通知总开关)
→ 检查当地时间窗口
→ 检查 POST_NOTIFICATIONS
→ 检查安装时长门槛
→ 检查全局 upper_limit 与 interval_time
→ 检查当前活动通知数
→ 收集当前合格的17个ID候选
→ 按第5.2节优先级排序
→ 检查候选ID的 upper_limit / interval
→ 检查模板语言、enabled、weight、repetitions
→ 校验动态变量;无效时切换同ID无变量模板
→ 生成对应 normal/ad/res/filter 通知
→ 保存通知ID、模板、策略组、展示时间和次数

任一步不满足时记录抑制原因;轮询通知等待下一循环,事件通知在有效期内等待下一可执行机会。

5.7 本地与服务端职责#

判断 执行位置
App 版本、国家、语言、灰度、策略组 中台下发,客户端校验
当前媒体数量、容量、To clean、Records、Notification Cleaner 数量 只在客户端本地判断
通知总开关、时段、频控、素材、路由、权重 中台配置,客户端执行
即时运营通知 中台通过 FCM 下发
配置更新 FCM 发送刷新信号,客户端再向中台取完整配置
本地周期通知 客户端调度;中台不能远程读取用户文件来替客户端判断
展示、点击、落地和转化埋点 客户端脱敏上报

6. 英文生产文案池#

英文为 fallback_locale,所有其他语言缺失或解析失败时使用本表。fixed_claim=true 的素材按竞品固定宣称方式保留,不要求本地实时扫描值。

模板 ID 通知 ID 标题 正文 变量/标记 路由
TIDY_01_A 1 View now Keep your storage organized with Tidyvo Cleaner. 无 home
TIDY_01_B 1 Clean Now Open Tidyvo for a quick storage check. 无 home
TIDY_02_A 2 View now Similar photos may be taking up your storage. 无 similar
TIDY_02_B 2 Start Cleaning Review duplicate photos and keep the ones you want. 无 duplicates
TIDY_03_A 3 View now Large videos may be using more space than you expect. 无 large_videos
TIDY_03_B 3 Handle Now Compress videos to reduce their storage size. 无 compress
TIDY_05_A 5 View now Keep selected photos and videos in Private Space. 无 private_space
TIDY_05_B 5 Handle Now Review your private files in Tidyvo. 无 private_space
TIDY_06_A 6 View now Clean up your screenshots regularly to make your phone run more smoothly! 无 screenshots
TIDY_06_B 6 Clean Now Let’s clean up your screenshots! 无 screenshots
TIDY_07_A 7 View now Duplicate contacts detected? Review and merge them now. 无 contacts
TIDY_07_B 7 Handle Now Keep your contact list organized with Tidyvo. 无 contacts
TIDY_08_A 8 View now Come see your recent cleanup records. 无 records
TIDY_08_B 8 View now Your recent storage activity is ready to review. 无 records
TIDY_09_A 9 Clean Now Junk Files Detected fixed_claim=true smart_clean
TIDY_09_B 9 Start Cleaning Too many junk files! Clean them up now! fixed_claim=true smart_clean
TIDY_09_C 9 Handle Now Junk files are slowing down your device. fixed_claim=true smart_clean
TIDY_09_D 9 Clean Now 1.8GB Junk Detected! Free Up Space Now → Speed Boost up to 35%↑ fixed_claim=true smart_clean
TIDY_09_E 9 Start Cleaning Deep Scan Complete! Junk Files Found - Tap to Eliminate Lag ➤ fixed_claim=true smart_clean
TIDY_09_F 9 Handle Now 23 Rarely Used Apps Detected! Uninstall to Free 8.5GB ➔ fixed_claim=true smart_clean
TIDY_10_A 10 View now Blurry photos are ready for your review. 无 blurry
TIDY_10_B 10 Clean Now Review low-quality photos and choose what to remove. 无 blurry
TIDY_11_A 11 Handle Now {count} selected items are still waiting for confirmation. {count} to_clean
TIDY_11_B 11 Clean Now Finish reviewing the items in To clean. 无 to_clean
TIDY_12_A 12 View now You haven't scanned your storage for a long time. 无 smart_clean
TIDY_12_B 12 Start Cleaning {days} days since your last storage scan. {days} smart_clean
TIDY_13_A 13 Clean Now You haven't cleaned up your phone junk for a long time. 无 smart_clean
TIDY_13_B 13 Handle Now Storage {used_percent} full! Clear junk now. {used_percent} smart_clean
TIDY_13_C 13 Start Cleaning {days} days with no junk cleared! Clean now. {days} smart_clean
TIDY_14_A 14 Clean Now New media detected. Scan your storage now. 无 smart_clean
TIDY_14_B 14 Handle Now A new large file may be taking up storage. 无 smart_clean
TIDY_15_A 15 Clean Now Cleanup complete. Review the remaining items? 无 to_clean
TIDY_15_B 15 Handle Now More selected files are waiting in To clean. 无 to_clean
TIDY_16_A 16 Clean Now Clean 100+ Old Screenshots? Free up space with one tap. fixed_claim=true screenshots
TIDY_16_B 16 Start Cleaning New screenshots detected. Review them now. 无 screenshots
TIDY_17_A 17 Clean Now {count} unread notifications! Manage notifications bar. {count} notification_cleaner
TIDY_17_B 17 Start Cleaning Notification overload? Declutter notifications now. 无 notification_cleaner
TIDY_17_C 17 Handle Now Unread notifications! Manage notifications bar. 无 notification_cleaner
TIDY_18_A 18 Clean Now Only {free_space} space left! Clear data now. {free_space} large_videos
TIDY_18_B 18 Start Cleaning {size} junk to be cleaned up! Clean junk instantly. {size} smart_clean
TIDY_18_C 18 Handle Now Large File Alert! 无 large_videos

7. 文案选择和变量规则#

7.1 文案选择#

  1. 先按 App 当前语言筛选模板;没有对应语言时使用英语。
  2. 同一 ID 中只选择 enabled=true 且未超过自身频控的模板。
  3. 按 weight 加权随机;首次录入时同一 ID 各模板权重平均。
  4. repetitions 控制同一模板可连续出现次数;超过后必须换该 ID 的其他模板。
  5. 模板全部冷却时跳过该 ID,继续选择下一优先级场景。

7.2 变量#

变量 来源 格式 缺失处理
{count} 本地扫描、To clean 或通知历史 本地化整数 换同 ID 无变量模板
{size} 本地扫描结果 MB / GB 自动格式化 换无变量模板
{free_space} 系统可用存储 MB / GB 换 Large File Alert!
{used_percent} 系统存储使用率 本地化百分比 换无变量模板
{days} 本地最近扫描/清理时间 本地化整数 换无变量模板

fixed_claim=true 不读取本地变量,直接展示素材中固定数字。

8. Notification Cleaner(通知清理功能)联动#

Notification Cleaner 是“管理其他 App 通知”的功能,不是 Tidyvo 给用户发送通知的开关。该功能已上线,本方案只补齐它与竞品同构通知系统的联动。

Notification access(通知使用权)是系统授权,允许 Tidyvo 查看和管理其他 App 的通知;ongoing(持续通知)是音乐播放、导航、前台服务等持续存在的通知,竞品不会清除这类通知。

环节 规则
权限状态 客户端记录 Notification access 是否有效
全局开关 保留已上线“通知隐藏”总开关
白名单 沿用线上版本现有白名单/逐 App 开关;若线上已按竞品约280包名实现,直接作为配置基线;com.tidyvo.cleaner 必须在运行时强制加入白名单
通知处理 非 ongoing、来源不是 Tidyvo 自身且不在白名单的通知取消并写入本地历史;Tidyvo 自身通知不得被取消或写入清理历史
ID 17 条件 本地历史数量可用时填 {count};不可用时选择无变量模板
ID 17 路由 notification_cleaner
权限失效 点击路由降级到 notification_access
常驻通知 通知 ID 2084960406,竞品同构属性见第10章

8.1 权限需求#

权限/状态 产品要求
POST_NOTIFICATIONS 按竞品方式在首次冷启动完成基础初始化后直接请求;系统未授权时不展示普通通知
用户拒绝通知权限 不伪造授权成功;后续进入通知相关功能时可再次引导或打开系统设置
Notification access 沿用线上 v1.0.5 已有 Notification Cleaner 授权入口和页面,不重复新建功能
Notification access 已授权 启动通知监听、隐藏规则、本地历史和常驻恢复链
Notification access 被撤销 停止监听;ID 17 点击改进入已有权限说明/系统设置链
其他既有权限 Notification Cleaner 已上线,本方案不改动其现有权限顺序、页面和授权结果处理

权限状态只决定能否执行对应能力,不改变 Offline_A / Online_B、17个ID和文案池的建档范围。

9. FCM Token 与中台联动#

FCM(Firebase 云消息服务)负责把服务端消息送到指定手机;Token(设备推送标识)相当于这台设备在 FCM 中的收件地址。FCM 是发送通道,不是普通通知、广告通知等通知类型。

9.1 Token 注册#

App 首次获取或刷新 Token 后上传:

{
  "installation_id": "install_uuid",
  "fcm_token": "token",
  "app_version": "{current_app_version}",
  "platform": "android",
  "locale": "en",
  "country": "US",
  "timezone": "America/New_York",
  "notification_permission": true,
  "notification_access": true,
  "strategy_group": "Online_B"
}

9.2 两类消息#

即时通知:中台筛选 Token 后通过 FCM HTTP v1 发送完整通知和路由。

配置刷新:

{
  "type": "config_refresh",
  "config_version": "tidyvo-ntf-001"
}

客户端比较版本后从中台拉取完整配置,校验、保存并重新安排本地任务。

9.3 统一 payload#

{
  "message_id": "msg_uuid",
  "campaign_id": "campaign_id",
  "notification_id": "9",
  "template_id": "TIDY_09_D",
  "type": "ad_ntf",
  "route": "smart_clean",
  "config_version": "tidyvo-ntf-001",
  "expire_at": "1786636800000"
}

服务账号和 HTTP v1 凭证只存在服务端,不进入 APK、中台前端、Git 或配置 payload。

10. 四类通知与特殊属性#

ntf 是 notification(通知)的缩写。竞品把通知分成以下四类,每类分别配置开关、频道、频率和展示属性:

类型 中文含义 竞品含义 Tidyvo 例子
normal_ntf(普通通知) 日常召回提醒 按时间循环或本地事件生成,受普通通知总上限和单素材频控控制 “发现重复照片”“有截图可以清理”“存储空间不足”
ad_ntf(广告/运营通知) 广告或运营召回 使用独立开关、频道和素材池;竞品兜底参数 -1 表示客户端不设总上限 “立即打开并清理手机”,点击后进入 Tidyvo 并承接现有广告链路
res_ntf(大样式通知) 自定义大通知 使用 RemoteViews(自定义通知布局)放大数字、关键词或图片 把“1.8GB”放大显示,或展示带图片的清理提醒
filter_ntf(常驻通知) 通知清理常驻状态 ongoing(持续)、no-clear(不可滑动清除),用于维持前台 Service “Tidyvo 正在管理通知”,点击进入 Notification Cleaner

例如,同一句“发现大文件”可以按普通样式做成 normal_ntf,也可以按竞品大版式做成 res_ntf;通知类型决定它怎么展示和受哪套配置控制。

特殊属性:

属性 配置 白话解释与例子
非小米 when(通知时间) 当前时间加365天 按竞品构造属性复刻;例如今天生成时,通知对象记录的时间写到一年后
删除动作 restart_foreground_service(重启前台服务) 用户清除可清除通知时,进入竞品的前台服务恢复入口
自动取消 常驻通知 false 点击常驻通知后不自动从通知栏消失
可见性 public(公开显示) 锁屏界面允许按系统设置显示通知内容
提醒 高优先级、声音、震动、灯光由频道配置 例如广告通知使用独立频道设置声音和震动
常驻通知 ID 2084960406 竞品前台服务固定使用的系统通知编号,Tidyvo按同构属性保留
服务返回值 START_STICKY(服务被回收后允许系统尝试重启) 前台 Service 被系统回收后,Android 可以再次创建该服务

11. 后台维持和恢复链#

竞品不是只靠一个后台 Service,而是准备多条恢复入口:某一条被系统延迟或回收时,其他入口再次检查并补齐任务。

能力 中文解释 竞品同构参数 Tidyvo 中的例子
NotificationListenerService(系统通知监听服务) Android 专门提供给通知管理工具的系统服务 系统绑定 收到其他 App 新通知后,按 Notification Cleaner 规则判断是否隐藏并写入本地历史
Foreground Service(前台服务) 带常驻通知运行的后台服务 START_STICKY 维持常驻通知,作为通知调度和恢复中心
Job(系统任务) 交给 Android 系统安排执行的后台任务 快速 3999–5999ms 前台 Service 启动失败后,约4至6秒安排一次快速补拉
WorkManager(后台任务管理器) Android 官方的可延迟周期任务工具 目标约18分钟 周期检查通知配置和恢复入口是否还存在
持久 Job(系统任务) 可在重启后重新安排的较长周期任务 1446000–1449999ms 约24分钟进行一次心跳恢复检查
Alarm(系统闹钟任务) 到达指定时间后唤起检查的长周期兜底 28799365ms 约8小时再次检查并补齐调度链
Boot receiver(开机广播接收器) 接收手机开机完成事件 BOOT_COMPLETED 用户重启手机后,重新安排 Service、Job、WorkManager 和 Alarm
Update receiver(升级广播接收器) 接收 App 安装更新完成事件 MY_PACKAGE_REPLACED Tidyvo 升级后重新建立通知任务
FCM(Firebase 云消息服务) 服务端到手机的消息通道 normal / high 分支 接收即时通知、配置刷新信号,或进入恢复检查
Activity resume(页面回到前台) 用户重新打开或切回 App App 进入前台 检查配置和后台任务,缺失时重新补齐

Android 及厂商系统可能延迟或限制这些能力;测试报告记录实际结果,但不删除对应实现。

12. 中台字段#

字段类型白话说明:boolean(开关,只有 true/false)、integer(整数)、string(文本)、enum(只能从规定选项中选择)、null(当前没有确认值,由后台另行填写)。

12.1 全局字段#

字段 类型
config_version string
master_switch boolean
emergency_stop boolean
strategy_group string
normal_enabled boolean
start_time / end_time local time
timezone_mode enum
upper_limit integer
interval_time_minutes integer
repetitions integer
continuous_ntf_num integer/null
ntf_cooling_time_minutes integer/null
max_visible_ntf integer/null
android_16_max_visible integer/null
ad_ntf_upper_limit integer
future_when_days integer

12.2 场景字段#

字段 类型
notification_id integer
enabled boolean
trigger_type interval / local_event / fcm
condition JSON rule
route enum
upper_limit integer
interval_minutes integer
priority integer
template_pool_id string
expire_minutes integer/null
notification_type normal_ntf / ad_ntf / res_ntf / filter_ntf

12.3 模板字段#

字段 类型
template_id string
notification_id integer
locale BCP 47 tag
title string
body string
route enum
variables string array
fixed_claim boolean
weight integer
enabled boolean

13. 埋点#

事件 关键字段
notification_eligible notification_id, strategy_group
notification_suppressed notification_id, reason
notification_scheduled notification_id, template_id
notification_shown notification_id, template_id, type
notification_open notification_id, template_id, route
notification_dismiss notification_id, template_id
notification_landing notification_id, route, result
notification_conversion notification_id, action
config_fetch config_version, result
service_restore source, result, elapsed_ms

Notification Cleaner 内容只在本机处理;埋点不上传通知标题、正文、发送者、验证码、图片或原始 PendingIntent。

14. 中台配置示例#

{
  "config_version": "tidyvo-ntf-001",
  "master_switch": true,
  "emergency_stop": false,
  "strategy_groups": {
    "Offline_A": {
      "normal_enabled": true,
      "upper_limit": 5,
      "interval_time_minutes": 30,
      "repetitions": 1,
      "ad_ntf_upper_limit": -1
    },
    "Online_B": {
      "normal_enabled": true,
      "upper_limit": 99,
      "interval_time_minutes": 2,
      "repetitions": 3,
      "continuous_ntf_num": 12,
      "ntf_cooling_time_minutes": 2,
      "max_visible_ntf": 5,
      "android_16_max_visible": 1,
      "ad_ntf_upper_limit": -1
    }
  },
  "assignment": {
    "strategy_group": "Online_B",
    "app_version_scope": "{feature_enabled_app_version}",
    "percentage": 100
  },
  "global_rule": {
    "start_time": "08:00",
    "end_time": "21:30",
    "timezone_mode": "device_local",
    "min_install_age_minutes": 5,
    "future_when_days": 365
  },
  "scenes": [
    {
      "notification_id": 17,
      "enabled": true,
      "trigger_type": "interval",
      "condition": {
        "notification_access": true,
        "notification_cleaner_enabled": true
      },
      "upper_limit": 2,
      "interval_minutes": 15,
      "priority": 88,
      "route": "notification_cleaner",
      "template_pool_id": "POOL_TIDY_17",
      "notification_type": "normal_ntf"
    }
  ]
}

15. 开发交付需求顺序#

本章只规定需求交付顺序,不执行开发。

  1. 开发团队以线上 v1.0.5 代码为唯一实现基线,不使用本地 v1.0.0 覆盖线上功能。
  2. 开发团队回填线上 Notification Cleaner 的真实内部路由、白名单、数据库和权限链映射;产品验收按本文行为,不按类名或代码结构验收。
  3. 中台提供策略、场景、模板、语言、灰度和回滚配置能力。
  4. 客户端支持配置解析、版本校验、本地缓存和失败兜底。
  5. 中台建立17个通知 ID及完整生产素材,并按确定语言范围导入多语言。
  6. 客户端提供统一通知跳板,并只接受第4章产品级落地页枚举。
  7. 完成 FCM Token 注册、配置刷新和即时通知需求。
  8. 完成 Service、Job、WorkManager、Alarm、开机/升级与 FCM 恢复链需求。
  9. 完成四类通知和特殊通知属性需求。
  10. 测试团队逐 ID、逐策略、逐语言和逐 ROM 验收。

16. 验收清单#

  • 开发团队确认实现基线为线上 v1.0.5,Notification Cleaner 现有能力未被旧代码覆盖。
  • Offline_A 和 Online_B 参数可由中台直接分配。
  • 17 个通知 ID 全部建档且各有 Tidyvo 场景、条件、路由和英文素材。
  • ID 14、15、16 能按 Tidyvo 等价本地事件触发。
  • App 12种现有语言均可选到对应文案,缺失时回退英语。
  • 全局、场景、素材、通知栏数量和重复次数同时生效。
  • Online_B 2分钟间隔、99条上限和广告 -1 能力可验证。
  • 统一跳板拒绝未知路由并回退 Home。
  • Notification Cleaner 权限、隐藏、历史、ID 17 和常驻服务形成闭环。
  • com.tidyvo.cleaner 运行时强制加入白名单,Tidyvo 自身普通通知和常驻通知均不会被 Notification Cleaner 清除或写入清理历史。
  • Service、快速 Job、18分钟 Work、24分钟 Job、8小时 Alarm、开机/升级和 FCM 均有测试结果。
  • 非小米未来365天时间戳和删除通知恢复服务按设备记录结果。
  • Token 刷新、解绑和失效清理可验证,APK及日志不暴露服务端凭证。
  • 每个 ID 验证展示、点击、落地、广告请求和埋点链路。
  • Pixel、Samsung、Xiaomi 至少各一台记录实际系统表现;未测设备明确标记未验证。
Tidyvo Cleaner · 产品资料中心