MyWallet 保活工程流程图
com.wise.ledger.app · 1.0.2 · 基于反编译静态分析,未在真机复现
常驻保活
触发与调度
通知回流
降级与兜底
主路径
失败降级
MyWallet 保活工程流程图
三层结构:入口层 9 个触发源汇入场景分发器,经判定与节流后分发到常驻保活链与通知回流链,并附降级与兜底路径。
① 入口层 · 触发源
② 调度层 · 判定与节流
③ 执行层 · 保活与通知
进程与前台:进程创建与回到前台时的保活修复入口
进程与前台
Application.onCreate
布下 Alarm,并尝试拉起前台服务
MainActivity.onResume
回到前台即修复常驻通知
前台轮询 60s
应用在前台时触发 TIMING
系统广播与闹钟:系统级唤醒入口,可在进程被杀后把体系拉回
系统广播与闹钟
开机 / 亮屏 / 灭屏 / 插拔电源
重排 Alarm 并修复常驻通知
解锁 USER_PRESENT
触发 UNLOCK 场景 · 间隔 20 分钟
Alarm 到点
setAndAllowWhileIdle · 间隔 40 分钟
用户行为与推送:前后台切换、广告点击与高优推送入口
用户行为与推送
HOME / RECENT / APP_EXIT
系统对话框广播 + Activity 计数
广告 onAdClicked
4 个广告回调点均有接线
FCM 高优推送
只作唤醒信号,不读标题与正文
全部汇入场景分发器
场景分发器 n7.d0:所有触发源统一汇入,按场景独立判定后再分发执行
场景分发器 n7.d0
9 个入口统一汇入,按场景独立判定
同场景并发用 AtomicBoolean 互斥
8 种场景:
TIMING / UNLOCK / ALARM / HOME
RECENT / APP_EXIT / AD_CLICK / PERMANENT
判定与节流:配置、状态、时间校准、权限通道与频道守护共 5 个模块
判定与节流(5 个模块)
配置解析 n7.h/g · 场景状态 n7.f0/e0
时间校准 n7.z · 权限与通道 n7.t
频道守护 n7.e/r:
getImportance()==0 则随机换频道 ID
读取 / 校验
判定通过 → 按场景执行
常驻保活链
通知回流链
AccountingNotifyForegroundService:唯一的常驻理由
前台服务 · 常驻通知 9211
Android 34+ 走 specialUse,返回 START_STICKY
startForeground 失败重试一次才 stopSelf
常驻通知:提供快捷记账入口
常驻通知构造 n7.x
频道 accounting_notify_persistent,不可划掉
按钮:新增支出 9212 / 新增收入 9213
文案轮换:多语言、多组文案循环使用
文案轮换 n7.k
内置 9 组文案与按钮,按场景轮转
服务端可下发 text / button / jump 覆盖
n7.i0:短时唤醒只为保证通知投递,不是持锁保活
灭屏 WakeLock 1s
tag MyWallet:notify,仅灭屏时申请
PARTIAL_WAKE_LOCK + ACQUIRE_CAUSES_WAKEUP
n7.d0.i:带按钮的场景化提醒通知
普通提醒 · 频道 NORMAL
通知 ID 按场景取 9101–9163 三段轮转
TIMING 30 / UNLOCK 20 / ALARM 40 分钟,日上限 10
n7.d0.h:媒体样式降级通道
MediaStyle 降级 · 9199
普通频道取不到时才启用,需 media 频道可用
固定通知 ID 9199
普通频道取不到时降级
降级与兜底
前台服务不可启动时的兜底路径
直接发通知 9211 兜底
startForegroundService 抛异常时触发
绕过前台服务,直接 notify(9211)
接收器退出后的排队投递兜底
IntentService 排队兜底
AccountingNotifyIntentService
JobIntentService 形态,BIND_JOB_SERVICE