Day 4 | 守护App技术揭秘:6个信号如何感知生命体征
---
做被动式感知,最核心的问题是:感知什么?
不是感知老人说了什么,不是感知老人在哪里,而是感知一件最基础的事——老人今天有没有在活动。
手机是现代人身上最贴近的设备。老人醒来第一件事看手机,睡前最后一件事放手机。手机的状态,就是老人状态的镜像。
守护App做的事,就是从这面镜子里读取信号。
---
六个信号,六种生命迹象
守护App监测六种事件,每一种都对应老人真实的日常行为:
1. 屏幕亮起(SCREEN_ON)
手机屏幕点亮的瞬间立即上报。老人早上起床第一个动作,往往就是看手机。这个信号出现,说明老人醒了。
2. 手机解锁(DEVICE_UNLOCK)
解锁手机,比屏幕亮起更强的活动信号。说明老人不只是误触了屏幕,而是有意识地在使用手机。
3. 充电插入(CHARGING)
插上充电器,说明老人在有意识地照料自己的设备。这个动作通常发生在睡前或固定时间,规律性强。
4. 接打电话(PHONE_CALL)
有通话行为,毫无疑问的活动证明。
5. 步数累计(STEPS_DETECTED)
手机内置加速度传感器持续计步,累计达到50步触发上报。老人在家走动,信号就来了。不需要老人做任何额外操作。
6. 兜底心跳(HEARTBEAT)
如果前五种信号都没有触发,系统每60分钟主动上报一次心跳包,确认App还在运行、网络还在连接。这是最后一道保障。
---
为什么是这六个,不是别的
选择这六个信号,背后有一个设计原则:只用老人已经在做的事,不增加任何新负担。
老人不需要学任何新操作。屏幕亮起、解锁手机、充电、打电话、走路——这些是任何一个正常使用手机的人每天都会做的事。守护App只是在这些行为发生时,悄悄发一个信号出去。
从老人的角度,手机跟以前没有任何区别。
这就是被动式感知的核心——系统围绕老人,而不是老人配合系统。
---
信号到达之后,系统怎么判断
六种信号持续上报到服务器,服务器做的事是计算:距离上一次信号,已经过去多少小时。
这个数字,对应六个状态:
- 正常(NORMAL):4小时内有信号
- 预警(WARNING):超过4小时
- 报警(ALERT):超过8小时,触发推送通知
- 紧急(EMERGENCY):报警后2小时内仍无任何活动
服务器每30分钟扫描一次所有老人的状态,超时就推送给子女。
有一个细节值得说:夜间23:00到早上7:00不计入无活动时间。老人睡觉是正常的,不应该在凌晨三点触发误报。
---
华为手机:最难搞定的一关
理论上很简单,实际上碰了很多墙。
最大的障碍来自华为。华为有一套激进的电池优化机制,会在后台主动杀掉应用进程。守护App的HeartbeatService是一个前台服务(Foreground Service),理论上不应该被杀,但华为的电池管理绕过了这个保护机制。
症状很具体:设备日志里正常状态应该是每小时一次HEARTBEAT,加上各种SCREEN_ON、STEPS_DETECTED。一旦华为把App杀掉,日志里就只剩SCREEN_ON和DEVICE_UNLOCK,HEARTBEAT彻底消失。
这意味着系统还以为老人在用手机,实际上守护App已经停止运行了。
解决方案是两步:
第一步,App启动时引导用户关闭电池优化限制——设置→应用→守护App→电池→选"不限制"。这一步需要用户手动操作,绕不过去。
第二步,在代码层面用WorkManager做双重保活,确保即使主进程被杀,WorkManager的任务队列还能在系统允许的时间窗口内重新拉起App。
这个坑踩得很深,最后的解决方案不是一行代码能描述的,是反复测试、反复失败、反复调整之后找到的。
母亲的华为手机是最终的验证环境。配置调整完之后,日志里HEARTBEAT规律出现,SCREEN_ON和STEPS_DETECTED也在正常上报,这才算真正跑通了。
---
数字说话
目前服务器日志里,母亲手机的信号记录是连续的。每天早上屏幕亮起,步数累计,充电插入,心跳包按时到达。
每次看到这些信号,知道她今天好好的。
这就安心了。
---
明天:三明治家庭的真实困境——一个朋友聚会上的真实对话。
守护App下载(安卓):https://lume.living/static/guardian.apk
Ai一人工厂
夜雨聆风