☰分类导航

软件工程/实战项目与案例
课程进度 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
@Entity(tableName = "todos")
3
public class TodoItem {
4
@PrimaryKey(autoGenerate = true)
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
});