🏗️ 整体架构(MVVM)
UI 层
MainActivity
MainScreen
HeaderView
ReminderInputView
QuickScenariosView
ReminderListView
ReminderEditSheet
↕ StateFlow / collectAsState
ViewModel
ReminderViewModel
inputText: StateFlow
reminders: StateFlow
requestPermissionEvent: SharedFlow
Repository
ReminderRepository
allReminders: Flow<List<Reminder>>
数据层
KnockitDatabase (Room)
ReminderDao
Reminder (Entity)
ReminderType (Enum)
服务层
GeminiService (AI 解析)
NotificationService
LocationService (GPS)
PrayerService (礼拜时间)
ReminderWorker (WorkManager)
AlarmReceiver
BootReceiver
🔄 AI 提醒创建流程
→
🧠
GeminiService
gemini-2.0-flash
→
📋
ParsedReminder
title / triggerAt / type
→
→
→
🔔
通知推送
NotificationService
📦 核心模块详解
🤖 GeminiService AI
- 调用 Gemini 2.0 Flash 解析自然语言
- 使用 responseSchema 强制 JSON 输出
- 支持多提醒批量返回
- 自动推断类型 (water / medicine / prayer…)
- HttpURLConnection 实现,零额外依赖
- 30s 超时 + 错误流处理
💾 数据层 (Room)
- 单表:reminders (v1,无 migration)
- 主键:UUID 字符串(跨平台兼容 iOS)
- 触发时间:Long epoch ms
- repeatRule:none / daily / weekly
- intervalMinutes:区间重复(喝水/baby)
- Repository 模式隔离 DAO
⏰ 通知调度
- 精确闹钟:AlarmManager (SCHEDULE_EXACT_ALARM)
- 区间重复:WorkManager PeriodicWorkRequest
- 开机恢复:BootReceiver 重新注册所有闹钟
- 通知权限动态申请(Android 13+)
- NotificationService 统一管理 channel
🕌 礼拜时间 (PrayerService) 网络
- GPS 定位获取经纬度
- 调用 Aladhan API 获取每日礼拜时间
- 自动为 5 次礼拜各创建每日重复提醒
- 时间过期则推迟到次日
🎨 UI 层 (Jetpack Compose)
- 全 Compose,无 XML 布局
- Material3 主题,暗色背景
- Edge-to-Edge + IME padding 适配
- ModalBottomSheet 编辑提醒
- StateFlow → collectAsState 响应式更新
🏭 依赖注入
- 手动 DI,无 Hilt / Koin
- KnockitApplication 作为依赖图根节点
- 懒加载 DB 和 Repository
- 编译更快,依赖关系透明
📁 目录结构
app/src/main/java/com/knockit/app/
├── KnockitApplication.kt
├── MainActivity.kt
├── data/
│ ├── db/
│ │ ├── KnockitDatabase.kt
│ │ └── ReminderDao.kt
│ ├── model/
│ │ ├── Reminder.kt
│ │ └── ReminderType.kt
│ └── repository/
│ └── ReminderRepository.kt
├── receiver/
│ ├── AlarmReceiver.kt
│ └── BootReceiver.kt
├── services/
│ ├── GeminiService.kt
│ ├── NotificationService.kt
│ ├── NotificationReceiver.kt
│ ├── LocationService.kt
│ ├── PrayerService.kt
│ ├── ReminderWorker.kt
│ ├── DateUtils.kt
│ └── ApiKeys.kt
└── ui/
├── MainScreen.kt
├── ReminderViewModel.kt
├── components/
│ ├── HeaderView.kt
│ ├── ReminderInputView.kt
│ ├── QuickScenariosView.kt
│ ├── ReminderListView.kt
│ ├── ReminderRowView.kt
│ └── ReminderEditSheet.kt
└── theme/
├── Color.kt
└── Theme.kt
🔐 权限清单
| 权限 | 用途 | 申请时机 |
| INTERNET |
调用 Gemini API + Aladhan 礼拜时间 API |
安装时自动 |
| POST_NOTIFICATIONS |
推送提醒通知 |
运行时(Android 13+) |
| ACCESS_FINE_LOCATION |
礼拜时间定位 |
点击「礼拜」场景时 |
| SCHEDULE_EXACT_ALARM |
精确闹钟(提醒准时) |
运行时(Android 12+) |
| RECEIVE_BOOT_COMPLETED |
重启后恢复所有提醒 |
安装时自动 |
| VIBRATE |
操作反馈震动 |
安装时自动 |
🏷️ 提醒类型
🔔 Custom(自定义)
- AI 自然语言解析,任意内容
- 默认单次,规则由用户/AI决定
🕌 Prayer(礼拜)
- GPS 定位 + Aladhan API
- 自动每日重复 × 5 次礼拜
💊 Medicine(吃药)
- 默认每日重复
- 固定标题「Take Medicine」
💧 Water(喝水)
- 默认每 60 分钟区间重复
- WorkManager 驱动
🏋️ Exercise(运动)
- 默认每日重复
- 固定标题「Time to Exercise」
🛠️ 技术栈
Kotlin
Jetpack Compose
Material3
Room Database
WorkManager
AlarmManager
Gemini 2.0 Flash
Google Location API
Coroutines + Flow
Navigation Compose
compileSdk 35 / targetSdk 35
minSdk 26 (Android 8.0+)