一个不依赖服务器的Android提醒工具

19 阅读4分钟

起因

我记性不太好。

妈妈生日忘了,第二天发红包补救;医生开的药漏吃,病好得慢;重要会议忘了准备,被领导点名。

试过系统闹钟——设不了"明年5月20日"这种远期日期。试过备忘录——写了等于没写,到时候根本想不起来打开。试过日历——弹一下就消失,划掉就错过。试过第三方提醒APP——要么功能臃肿,要么依赖服务端推送,网络一断、后台一杀,提醒就没了。

最膈应的是隐私:我的吃药时间、家人生日、纪念日,全存在别人的服务器上。

市面上的产品要么不够强,要么不够私。那我就自己写一个。


小鹊幸做了什么

核心就一句话:你设一次,到时间强制喊你,清后台/重启/断网都照样响。

技术上有几个点我觉得值得聊一下:

1. 离线强提醒

AlarmManager.RTC_WAKEUP + setExactAndAllowWhileIdle,提醒逻辑跑在系统层面,不依赖APP进程活着。

绕开 Doze 和厂商后台管理是关键。还要监听 BOOT_COMPLETEDTIME_SET,手机重启后把所有未过期事件重新注册回去——不然用户设了一次,重启就没了,信任直接崩塌。

2. 纯本地架构

  • 数据全在 SQLite 本地,不上传任何服务器
  • 开发者(也就是我)也看不到用户数据,物理级隐私
  • 不需要注册,游客模式打开就能用,微信/QQ 登录是可选的(留着做后续增值)
  • 唯一网络请求是微信消息推送,旁路,不影响主体

边际成本趋近于零,用户多了我也不慌。这也是为什么敢说"设一次,用一辈子"——就算我明天消失了,用户设好的提醒照样年年响。这不是营销话术,是纯本地单机应用的客观事实。

3. 农历计算

长辈生日大多是农历的,系统闹钟和大部分提醒工具搞不定。

我一开始想接第三方库(LunarCalendarlunar-java),后来发现要么 API 方向不对(公历→农历为主,农历→公历要扒源码),要么体积大依赖多。干脆自己写。

查表法,1900-2099 共200个 int,每个 int的 bit03 存闰月、bit415 存12个月大小月:

// 单int编码:低4位=闰月(0-12),bit4~15=12个月大小月
private static final int[] LUNAR_INFO = {
    0x04bd8, 0x04ae0, 0x0a570, ... // 200个
};

⚠️ 踩过一个坑:一开始 getLeapMonth写成 yearData >> 16,结果所有闰月全读错。后来才确认数据表是低4位存闰月,应该 & 0xf。上线前务必用1900闰八月验证。

双向转换(农历↔公历)都支持,输出 Calendar直接喂给 AlarmManager。农历事件每年打开APP时动态算当年公历日期,重新注册闹钟——因为农历每年对应公历都变,不能简单地"每年重复"。

4. 三保险

  • 第一层:APP 系统级离线唤醒
  • 第二层:一键同步到系统日历
  • 第三层:绑定微信后收消息推送

跟市面产品的差异

系统闹钟备忘录/日历云端提醒APP小鹊幸
远期日期
强制弹窗(清后台也响)部分
离线可靠
农历少数
数据不上传部分
无需注册部分

商业化

纯本地架构,没服务器运维成本。前期完全免费攒用户,后期开会员(一次性买断,终身),解锁农历、微信推送、高级重复规则。

不做订阅制。你买一次工具就是你的,没有"停止付费就锁功能"这种事。

收款暂时走的收款码+后台手动插单(VIP状态服务端控制,可试用7天,到期查订单→有则转正无则收回)。用户量起来之前没必要接支付,先把产品打磨好。


下载

👉 www.pgyer.com/xiaoquexing…

QRCode_258.png

不用注册,打开就能用。提醒不准大概率是自启动权限没开,APP 内有按品牌适配的图文引导。


一点感想

这个项目核心代码不到3000行,但把"忘事"这个痛点解决到位了。

很多时候我们不需要复杂的架构,只需要把一个点真正做透。纯本地、离线唤醒、农历计算——这三个点每个都不算难,但凑在一起再做扎实,市面上能打的就不多了。

如果你也在做独立开发,或者对哪个技术点感兴趣(农历算法 / 离线唤醒的厂商适配),欢迎评论区聊。


小鹊幸——记性不好?交给我。 效果预览

微信图片_20260702105131_105_10.png

微信图片_20260702113023_107_10.png

微信图片_20260702113024_108_10.png

微信图片_20260702135650_55_1.png

微信图片_20260702135651_56_1.png

微信图片_20260702135651_57_1.png