草船借箭——使用 trae 实现 Android 推送功能

背景

正在复盘学习 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

模块说明

  1. data 层

    • model :定义数据模型,如 NotificationData.kt 用于表示通知数据。
    • repository :负责与数据源交互,如 NotificationRepository.kt 可以处理 FCM 相关的数据操作。
  2. di 层 :依赖注入模块,如 AppModule.kt 用于提供依赖对象。

  3. domain 层

    • usecase :封装业务逻辑,如 GetNotificationUseCase.kt 处理获取通知的业务逻辑。
  4. presentation 层

    • view :包含视图组件,如 MainActivity.kt 是应用的主界面。
    • viewmodel :连接视图和数据的桥梁,如 MainViewModel.kt 负责处理视图的数据和逻辑。
  5. service 层 :处理后台服务,如 MyFirebaseMessagingService.kt 用于接收 FCM 消息。

流程图,时序图

流程图:

graph LR classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px; A(应用启动):::process --> B(初始化FCM):::process B --> C(获取设备令牌):::process C --> D(将令牌发送到服务器):::process E(服务器发送通知):::process --> F(FCM接收通知):::process F --> G{通知类型}:::process G -->|数据消息| H(处理数据消息):::process G -->|通知消息| I(显示通知):::process I --> J(用户点击通知):::process J --> K(打开对应界面):::process

时序图:

sequenceDiagram participant App as 应用 participant FCM as FCM服务 participant Server as 服务器 participant VM as ViewModel participant V as 视图 App->>FCM: 初始化 App->>FCM: 获取设备令牌 App->>Server: 发送设备令牌 Server->>FCM: 发送通知 FCM->>App: 接收通知 App->>VM: 处理通知 VM->>V: 更新视图 V-->>App: 用户交互

编码实现

使用最新 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,欢迎讨论

相关推荐
孟健7 小时前
MCP 榜一大哥 SequentialThinking,99%的人都不会用?全网最新实操+认知升级!
cursor·mcp
huang_xiaoen8 小时前
试一下阿里云新出的mcp服务
人工智能·阿里云·ai·云计算·mcp
杀生丸学AI9 小时前
【三维重建与生成】GenFusion:SVD统一重建和生成
大模型·llm·aigc·三维重建·稀疏重建·蒸馏与迁移学习·扩散模型与生成模型
程序员小灰10 小时前
漫画:什么是MCP协议?
人工智能·aigc·mcp
小白跃升坊12 小时前
Chat to MySQL 最佳实践:MCP Server 服务调用
ai·大语言模型·it运维·mcp
陈明勇14 小时前
MCP 协议更新详解:从 HTTP+SSE 到 Streamable HTTP
人工智能·ai编程·mcp
shelgi17 小时前
Eino实践---从入门到MCP尝鲜
mcp
sophister17 小时前
MCP server 开发半入门——"hello world"
人工智能·cursor·mcp
cv也要开心17 小时前
超越界限:AI技术融合 - Agent、RAG、Function Call与MCP
ai编程·mcp
Miku1617 小时前
Cline + GitHub MCP 学习记录
mcp·cline