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 文案选择#
- 先按 App 当前语言筛选模板;没有对应语言时使用英语。
- 同一 ID 中只选择
enabled=true且未超过自身频控的模板。 - 按
weight加权随机;首次录入时同一 ID 各模板权重平均。 repetitions控制同一模板可连续出现次数;超过后必须换该 ID 的其他模板。- 模板全部冷却时跳过该 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. 开发交付需求顺序#
本章只规定需求交付顺序,不执行开发。
- 开发团队以线上
v1.0.5代码为唯一实现基线,不使用本地 v1.0.0 覆盖线上功能。 - 开发团队回填线上 Notification Cleaner 的真实内部路由、白名单、数据库和权限链映射;产品验收按本文行为,不按类名或代码结构验收。
- 中台提供策略、场景、模板、语言、灰度和回滚配置能力。
- 客户端支持配置解析、版本校验、本地缓存和失败兜底。
- 中台建立17个通知 ID及完整生产素材,并按确定语言范围导入多语言。
- 客户端提供统一通知跳板,并只接受第4章产品级落地页枚举。
- 完成 FCM Token 注册、配置刷新和即时通知需求。
- 完成 Service、Job、WorkManager、Alarm、开机/升级与 FCM 恢复链需求。
- 完成四类通知和特殊通知属性需求。
- 测试团队逐 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 至少各一台记录实际系统表现;未测设备明确标记未验证。