课程进度 92% · 第11/11章第11/11章 · 标签 1/6
— 1 —
项目开发流程
原Todo实体和输入监听是综合项目片段,需Room、DAO、ViewModel、布局和后台执行环境。下面补足需求、状态、失败恢复及验收;不把创建一个@Entity类描述为完整可运行应用。
一个完整的 Android 项目开发遵循以下流程,从需求分析到上线发布。
先把功能写成可验收行为:合法新增、空白拒绝、保存后重启仍在、完成状态可恢复。技术栈选择应围绕这些行为,不能用Room或MVVM名称代替数据一致性证明。每一阶段都保留小样本,便于判断问题发生在输入、规则、存储还是渲染。
- 需求分析与原型设计 —— 明确功能、绘制 UI 原型图
- 架构设计与技术选型 —— 选择架构模式(MVP/MVVM)与技术栈
- 环境搭建 —— 初始化项目、配置 Gradle 依赖
- 代码开发 —— 分模块迭代开发,持续集成
- 测试阶段 —— 单元测试、UI 测试、性能测试、兼容性测试
- 部署上线 —— 签名打包、发布到 Google Play
- 运维与迭代 —— 监控崩溃、用户反馈、版本更新
◆
项目技术栈推荐
```text 语言:Kotlin 架构:MVVM + Jetpack UI:Jetpack Compose / XML 网络:Retrofit + OkHttp 图片:Coil / Glide 数据库:Room DI:Hilt 异步:Kotlin 协程 + Flow 测试:JUnit + Mockito + Espresso ```
text
1
语言:Kotlin
2
架构:MVVM + Jetpack
3
UI:Jetpack Compose / XML
4
网络:Retrofit + OkHttp
5
图片:Coil / Glide
6
数据库:Room
7
DI:Hilt
8
异步:Kotlin 协程 + Flow
9
测试:JUnit + Mockito + Espresso
— 2 —
综合案例:Todo 应用
从零构建一个 Todo 待办事项应用,涵盖 Android 开发核心知识点。
Todo实体只定义数据形状,完整新增还需DAO、后台仓库、ViewModel状态和列表观察。点击后先显示保存中,只有数据库提交成功才确认完成;失败时保留草稿并允许重试。创建时间和稳定id由契约确定,不能用当前列表下标代替身份。
```java
// Todo 数据模型
@Entity(tableName = "todos")
public class TodoItem {
@PrimaryKey(autoGenerate = true)
public long id;
public String title;
public String description;
public boolean completed;
public long createdAt;
}
// 添加任务的交互逻辑
editText.setOnEditorActionListener((v, actionId, event) -> {
String todo = v.getText().toString().trim();
if (!todo.isEmpty()) {
TodoItem item = new TodoItem();
item.title = todo;
item.createdAt = System.currentTimeMillis();
// 通过 ViewModel 保存
viewModel.insert(item);
v.setText("");
Toast.makeText(context, "任务已添加", Toast.LENGTH_SHORT).show();
}
return true;
});
```
java
1
// Todo 数据模型
2
3
public class TodoItem {
4
5
public long id;
6
public String title;
7
public String description;
8
public boolean completed;
9
public long createdAt;
10
}
11
12
// 添加任务的交互逻辑
13
editText.setOnEditorActionListener((v, actionId, event) -> {
14
String todo = v.getText().toString().trim();
15
if (!todo.isEmpty()) {
16
TodoItem item = new TodoItem();
17
item.title = todo;
18
item.createdAt = System.currentTimeMillis();
19
20
// 通过 ViewModel 保存
21
viewModel.insert(item);
22
23
v.setText("");
24
Toast.makeText(context, "任务已添加", Toast.LENGTH_SHORT).show();
25
}
26
return true;
27
});