背景
正在复盘学习 Android 原生开发,寻思想做个消息推送,此类功能业界方案已然很成熟,看是否能借助 豆包 + trae 完成模板开发,准备使用 豆包先进行方案选型及结构设计,然后直接将结构设计发送给 trae 进行编码尝试完成功能
实现
首先借助豆包完成方案选型,提出最小引入插件,尽可能轻量级完成
方案设计
选型提问:
text
我要使用 kotlin 完成一个 Android 消息推送功能,首版对样式无要求直接使用系统默认,
要求尽量减少三方插件引用,建立结构清晰的工程层级,从实现复杂度输出可以满足的两种
方案对比
得到:
方案一:使用 Firebase Cloud Messaging(FCM) FCM 是 Google 提供的免费消息传递解决方案,可用于向 Android 设备发送通知和数据消息。尽管它是 Google 提供的服务,但在 Android 生态系统中被广泛使用,且无需大量第三方插件。
方案二:使用 HTTP 协议自建服务器推送,此方案需自己搭建服务器,服务器负责向 Android 设备发送消息。这种方式更具灵活性,但实现复杂度较高。
对比项 | 方案一(FCM) | 方案二(自建服务器) |
---|---|---|
实现复杂度 | 较低,只需按照 Firebase 文档配置项目和添加依赖,处理消息接收逻辑即可。 | 较高,需要搭建服务器,处理设备注册、消息发送等逻辑。 |
灵活性 | 相对较低,受限于 FCM 的功能和规则。 | 较高,可以根据需求自定义服务器逻辑和消息格式。 |
稳定性 | 较高,由 Google 提供服务,有较好的稳定性和可靠性。 | 取决于服务器的性能和维护情况。 |
数据安全性 | 较高,FCM 提供了一定的数据加密和安全机制。 | 需自行实现数据加密和安全机制。 |
整体结构设计提问:
使用方案一(FCM)进行功能实现,语言是 kotlin,视图使用 AndroidX,整体数据联动
使用 MVVM 实现,输出整体结构设计,并以 mermaid 形式输出功能流程图,时序图
得到:
工程结构
plantext
app/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── yourcompany/
│ │ │ └── yourapp/
│ │ │ ├── data/
│ │ │ │ ├── model/
│ │ │ │ │ └── NotificationData.kt
│ │ │ │ ├── repository/
│ │ │ │ │ └── NotificationRepository.kt
│ │ │ ├── di/
│ │ │ │ └── AppModule.kt
│ │ │ ├── domain/
│ │ │ │ ├── usecase/
│ │ │ │ │ └── GetNotificationUseCase.kt
│ │ │ ├── presentation/
│ │ │ │ ├── view/
│ │ │ │ │ └── MainActivity.kt
│ │ │ │ ├── viewmodel/
│ │ │ │ │ └── MainViewModel.kt
│ │ │ ├── service/
│ │ │ │ └── MyFirebaseMessagingService.kt
│ │ ├── res/
│ │ │ ├── layout/
│ │ │ │ └── activity_main.xml
│ │ │ ├── values/
│ │ │ │ └── strings.xml
│ ├── test/
│ │ └── java/
│ │ └── com/
│ │ └── yourcompany/
│ │ └── yourapp/
│ │ └── ExampleUnitTest.kt
├── build.gradle
模块说明
-
data 层
- model :定义数据模型,如
NotificationData.kt
用于表示通知数据。 - repository :负责与数据源交互,如
NotificationRepository.kt
可以处理 FCM 相关的数据操作。
- model :定义数据模型,如
-
di 层 :依赖注入模块,如
AppModule.kt
用于提供依赖对象。 -
domain 层
- usecase :封装业务逻辑,如
GetNotificationUseCase.kt
处理获取通知的业务逻辑。
- usecase :封装业务逻辑,如
-
presentation 层
- view :包含视图组件,如
MainActivity.kt
是应用的主界面。 - viewmodel :连接视图和数据的桥梁,如
MainViewModel.kt
负责处理视图的数据和逻辑。
- view :包含视图组件,如
-
service 层 :处理后台服务,如
MyFirebaseMessagingService.kt
用于接收 FCM 消息。
流程图,时序图
流程图:
时序图:
编码实现

使用最新 trae 版本,开启 Builder,直接将结构要求及时序图流程图发送给它进行编码实现;考虑整体单次输出逻辑过多会导致阶段,先输出 module 结构
plantext
新建module 模块实现消息推送功能,其中目录结构如下,注意整体进行微调变更 module 名称后引入到 app 入口处
push_notification/
'''''''''''''''(步骤1工程图)
执行完成后在我已有工程结构下新建了push_notification module 路径及基础代码实现

然后将步骤1生成的流程图,时序图发送它进行逻辑调整
python
引入 Firebase Cloud Messaging 插件完成当前模块的消息推送功能,整体的流程图
及时序图要求如下(步骤1流程图,时序图)
'''''''''
直接运行就出现了大量导包异常,继续异常发送给 trae 继续更改
在一开始实现的模块调用引入了 compose,导致项目调用异常,省略 n 个提词,环境修改这一步挺耗时的,提示词有偏差的话 ai 会不断的兜圈子;在配置 gradle 上挺麻烦的,这里使用时候建议一定要告知当前环境配置,及上下文要求;
最后完成后进行模块抽离
planttext
- 主目录结构:
- build.gradle: 模块构建配置文件
- src/main: 主源代码目录
- Java源代码结构 (com.example.push_notification包下):
- MainActivity.kt: 主活动类
- PushNotificationInitializer.kt: 推送通知初始化类
- PushNotificationManager.kt: 推送通知管理类
- api/PushNotificationApi.kt: 推送通知API接口
- data/: 数据层相关代码
- di/AppModule.kt: 依赖注入模块
- domain/usecase: 领域层用例
- presentation/view/viewmodel: 表示层视图和ViewModel
- push_notification/MyFirebaseMessagingService.kt: Firebase消息服务
- receiver/NotificationAlarmReceiver.kt: 通知接收器
- service/MyFirebaseMessagingService.kt: 消息服务
- util/Constants.kt: 常量工具类
plantext
完善 NotificationSettingsActivity 及 push_notification 逻辑,作为一个
设定延迟推送模块引入到 app,可以设定一定时间后进行系统推送,支持自定义推送消息

发现在虚拟机点击设置推送后就发送闪退,猜测可能与测试环境有关,改为真机调试后果然正常了

简单总结
对于 Android 开发使用 trae 可以快速搭建脚手架,完成演示功能,槽点是对于 Android 本身就很折磨的环境配置,工程化引入如果没进行环境声明词提示会引入较多问题;在起始阶段对于使用方式要求很高,因为一开始定错了策略后续转换成本极高; 综合整体耗时将近 1 day,其中对于有一定经验人员开发算不上提效,但是生成的模块挺工整的;
本文样例的工程放置在 assistant/push_notification at main · lizy-coding/assistant,欢迎讨论