原创安卓软件:吃药没? 水果玉米系列
本帖最后由 溯水流光 于 2025-5-21 18:05 编辑# 吃药没? 软件说明书 水果玉米系列
> 水果玉米没有特殊含义, 仅仅只是方便搜索的关键字, 来源于我的一顿早餐
>
> Giee: https://gitee.com/HHandHsome/did-i-take-my-meds
>
> Github: https://github.com/HHsomeHand/did-i-take-my-meds
## 软件的功能
快速记录服药信息,避免漏服或重复服药
## 下载地址
gitee release: https://gitee.com/HHandHsome/did-i-take-my-meds/releases/tag/v1.1.2
github release: https://github.com/HHsomeHand/did-i-take-my-meds/releases/tag/v1.1.2
找到带 apk 的字样, 点击下载即可
## 预览
<img src="data/attachment/forum/202505/21/175258wiyl6zd96rnd1trw.png" width="500" />
<img src="data/attachment/forum/202505/21/175801unzsstln68wkt866.jpg" width="500" />
## 如何使用 (必读)
由于国产的 Android 系统的后台管理非常严格, 所以我们普通开发者, 必须要另辟蹊径, 来确保自己的 App, 不会被厂商的系统给乱杀掉, 以此来给用户提供服务.
声明: 本软件完全离线,绿色且安全,甚至没有申请联网权限。
### 自启动白名单
后台服务需要自启动, 启动后, 执行时间的判断逻辑, 才能给您提供发消息的服务
<img src="data/attachment/forum/202505/21/175922hihb13hjs1baj9pc.jpg" width="800" />
### 允许后台耗电
后台服务需要执行逻辑, 执行逻辑就需要耗电, 耗电就容易被 国改android 停止掉服务
!(data/attachment/forum/202505/21/180003b5rjvrpogoeze180.jpg)
### 无障碍
这里需要无障碍权限, 提升服务的优先级, 避免被操作系统停止
<img src="data/attachment/forum/202505/21/180026c260i8444i846x9h.jpg" width="800" />
> To 安卓开发者同好: 软件最大的难点,在于安卓的后台服务保活,详细解决方案请看:
>
> https://mp.weixin.qq.com/template/article/1747807756/index.html
>
> 前台服务不是金钥匙, 在睡眠或省电模式下依旧会被杀掉, 只有无障碍才能完全保活
### 获取更新
为了保证软件完全离线,所以没有加入自动更新机制。
同时,国内的应用市场上架APP,都需要软件著作权。
而注册软件著作权需要 200 块,实在是没有必要。
所以本软件弄了一个交流群,方便大家获取更新信息。
群号: 1038206078
加群暗号: 123456
## 介绍 & 软件的灵感来源
### 致敬前辈
Github: https://github.com/CorruptedArk/did-i-take-my-meds
非常优秀的软件, 帮助我记录了很多次的服药. 但我个人觉得无法满足自己的需求, 于是动手写了一个软件
### 本软件的前身 玉米日志:
玉米日志是款强大的软件, 界面高度自定义, 而且使用场景不仅仅只局限于记药
Gitee: https://gitee.com/HHandHsome/pwa-corn-log
这款软件也是我开发, 但受限于这款软件使用的技术, 导致这款软件的上限被卡死了, 无法更进一步, 实现更为强大的功能
于是我另起炉灶, 重新用新技术, 实现了我心中的记药软件
### 本软件
我重新用不同的技术,重新写了一个 APP,单独编写了玉米日志的药律模块,以支持更为强大的功能。
软件功能: 快速记录服药信息,避免漏服或重复服药
+ 功能1) 在固定服药间隔后,通过操作系统,发通知,提示服药
+ 功能2) 服药经常和吃饭一块,所以软件记药后,使用操作系统自带的闹钟软件,进行倒计时,提醒刷牙
## 技术相关
项目技术栈: 安卓原生 + kotlin + jetpack compose
### 学习资料推荐
> 书籍都可以买二手的, 比较便宜
第一行代码 第三版 郭霖老师的: https://book.douban.com/subject/34996842/
jetpack compose 入门系列教程 也是郭霖老师的: https://mp.weixin.qq.com/s/n-_-LcMZokgmgYS7-wgk2g
android 动态权限申请库 郭霖老师的: https://mp.weixin.qq.com/s/7RpGzTjXo9rnHRCVEnrYWQ
+ 库地址: https://github.com/guolindev/PermissionX/issues
+ jetpack compose 中使用 PermissionX, 我自己写的随记: https://blog.csdn.net/RedDragon_Will/article/details/147860588
郭霖老师的 Flow 三部曲, 用于取代 LiveData 和实现事件总线: https://mp.weixin.qq.com/s/TRr_isgU7VVVuJ9rOMZUhw
这些就相当够用了
### 本软件架构
使用了 ViewModel 做全局状态管理
Flow 做 响应式数据(MutableStateFlow) + 事件总线(MutableSharedFlow)
jetpack compose 代替传统 View 布局
### jetpack compose vs flutter
我个人认为 jetpack compose 是比 flutter 更好用的。
因为 jetpack compose 诞生时间比 flutter 晚, 所以语法更现代
#### kotlin vs dart
jetpack compose 是基于 kotlin 的, kotlin 设计得比 dart 要优雅
kotlin 的语法是比 dart 更舒服的,数据类、单例类的语法糖都很好用。
```kotlin
// kotlin
// User 数据类
data class User(val id: Int, val name: String)
// Singleton 单例类
object Singleton {
fun doSomething() {
println("Singleton is working!")
}
}
```
```dart
// dart
class User {
final int id;
final String name;
User(this.id, this.name);
@override
String toString() => 'User(id: $id, name: $name)';
}
class Singleton {
static final Singleton _instance = Singleton._internal();
factory Singleton() => _instance;
Singleton._internal();
void doSomething() {
print('Singleton is working!');
}
}
```
#### 组件对比
```kotlin
@Composable
fun Section() {
Column(
modifier = Modifier.padding(16.dp)
) {
Button(onClick = { /*TODO*/ }) {
Text("Button 1")
}
Button(onClick = { /*TODO*/ }) {
Text("Button 2")
}
Button(onClick = { /*TODO*/ }) {
Text("Button 3")
}
}
}
```
```dart
import 'package:flutter/material.dart';
class Section extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
ElevatedButton(
onPressed: () {},
child: Text("Button 1"),
),
ElevatedButton(
onPressed: () {},
child: Text("Button 2"),
),
ElevatedButton(
onPressed: () {},
child: Text("Button 3"),
),
],
);
}
}
```
会 flutter 上手 jetpack compose 非常快,getx 对应过来就是 viewmodel。
jetpack compose 唯一比较弱势的地方就是生态, jetpack compose 的生态很小, 就拿 Color Picker 组件举例, flutter 社区有很多好用的控件, 但是 compose 没多少.
而且 jetpack compose 目前虽然已经是稳定版了, 但是大量的 api 仍然是 `实验性` 特性, 还不完全稳定, api 变化大.
## 尾声
感谢阅读和使用, 如有任何问题, 欢迎提 Gitee & GitHub issue, 或是直接联系我
页:
[1]