🔔 Knockit Android

架构分析报告 · v1.0.5 (versionCode 5)
targetSdk 35 Kotlin Jetpack Compose Gemini AI MVVM

🏗️ 整体架构(MVVM)

UI 层
MainActivity
MainScreen
HeaderView
ReminderInputView
QuickScenariosView
ReminderListView
ReminderEditSheet
↕ StateFlow / collectAsState
ViewModel
ReminderViewModel
inputText: StateFlow
reminders: StateFlow
requestPermissionEvent: SharedFlow
↕ suspend / Flow
Repository
ReminderRepository
allReminders: Flow<List<Reminder>>
↕ Room DAO
数据层
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
💾
Room DB
本地持久化
AlarmManager
精确闹钟调度
🔔
通知推送
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 // 应用根,手动 DI ├── MainActivity.kt // 权限请求,Compose 入口 ├── data/ │ ├── db/ │ │ ├── KnockitDatabase.kt // Room 单例 │ │ └── ReminderDao.kt // CRUD + Flow │ ├── model/ │ │ ├── Reminder.kt // Room Entity │ │ └── ReminderType.kt // 7 种类型枚举 │ └── repository/ │ └── ReminderRepository.kt ├── receiver/ │ ├── AlarmReceiver.kt // 到时触发通知 │ └── BootReceiver.kt // 开机恢复闹钟 ├── services/ │ ├── GeminiService.kt // AI 自然语言解析 │ ├── NotificationService.kt // 调度 + Channel │ ├── NotificationReceiver.kt // 显示通知 │ ├── LocationService.kt // GPS 定位 │ ├── PrayerService.kt // 礼拜时间 API │ ├── ReminderWorker.kt // WorkManager 区间任务 │ ├── DateUtils.kt // ISO 8601 解析 │ └── ApiKeys.kt // Gemini Key └── ui/ ├── MainScreen.kt // 根 Compose 屏幕 ├── ReminderViewModel.kt // 核心业务逻辑 ├── components/ │ ├── HeaderView.kt │ ├── ReminderInputView.kt // AI 输入框 │ ├── 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 驱动

👶 Baby(婴儿护理)

  • 默认每 180 分钟(3 小时)
  • 区间提醒

🏋️ Exercise(运动)

  • 默认每日重复
  • 固定标题「Time to Exercise」

😴 Sleep(睡觉)

  • 默认每日重复
  • 固定标题「Bedtime」

🛠️ 技术栈

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+)