开发日志
吃药打卡App开发日志001
技术选型:为什么用原生 Kotlin
项目目标用户是家中的长辈,Android 手机占比高,对 App 体积和稳定性敏感。选择 Kotlin + Android 原生开发,APK 控制在 5.8MB 左右,且 AlarmManager、NotificationChannel 等系统 API 直接调用,无需处理跨平台插件兼容问题。
依赖管理使用 Gradle Version Catalog,四个源文件各司其职:
| 文件 | 职责 |
|---|---|
MainActivity.kt | 双状态页面、打卡逻辑、日历渲染、设置弹窗 |
ReminderHelper.kt | 闹钟调度(设置/取消/恢复)、时间存取 |
ReminderReceiver.kt | 闹钟触发 → 弹通知 + 链式重调度 |
BootReceiver.kt | 开机广播 → 恢复闹钟 |
双状态页面
App 打开时只有两种可能,所以用 stateA(未吃)和 stateB(已吃)两个 View 互斥切换。状态A中央是一个 220dp 的珊瑚橘渐变大圆按钮,点一下即完成打卡,不需要任何表单。状态B展示统计卡片和月历。
日历没有引入第三方库,直接用 GridLayout 手写——7 列网格 + 五种日期状态 Drawable,比库方式更轻量。遇到的一个坑是 GridLayout 等分列宽,用 GridLayout.spec(UNDEFINED, 1, 1f) 权重方案解决,适配各种屏幕密度。
闹钟调度的几个关键点
精准唤醒:AlarmManager.setExactAndAllowWhileIdle() 在 Doze 省电模式下也能准时触发,每天一次的频率在系统限制内。
链式调度:每次闹钟触发后自动为明天重新调度,无需后台 Service。ReminderReceiver.onReceive() 先弹通知,再调 rescheduleIfNeeded()。
跨天边界:凌晨前后的闹钟用绝对毫秒值判断,Calendar 计算时若今日时间已过则自动 +1 天。
开机恢复:BootReceiver 监听 BOOT_COMPLETED,重启后自动恢复闹钟。国产 ROM 部分需要用户手动加白名单。
权限适配:Android 8.0+ 创建 NotificationChannel,Android 13+ 请求 POST_NOTIFICATIONS 运行时权限。
视觉设计:珊瑚橘暖色调
传统医疗 App 多用蓝/绿色调,吃药打卡则选用珊瑚橘(#FF6B4A)——传递温暖和关怀感。奶油色渐变背景 + 暖棕文字,整体偏向生活化而非工具化。
针对老年用户做了调整:220dp 大按钮、44dp+ 可点击区域、14sp+ 字号。日历用不同背景区分五种日期状态,今天未打卡是醒目的琥珀色圆环而非红色警告,避免给用户压力。
待办事项
当前为 v1.0 版本,后续计划支持多组药物提醒、数据导出、云端备份、桌面小组件和家庭共享功能。
> 📅 项目起始日期:2026 年 7 月
> 📦 包名:com.example.pilltracker
> 🏷 版本:v1.0
> 📱 支持系统:Android 8.0+