现已开源
GitHub地址:xiaolin0429/SchedulingAssistant: 排班助手是一款专为需要倒班工作的人员设计的Android应用。它提供了直观的排班管理、闹钟提醒和数据统计功能,帮助用户更好地管理自己的工作时间。

排班助手 (Scheduling Assistant)

项目简介

排班助手是一款专为需要倒班工作的人员设计的Android应用。它提供了直观的排班管理、闹钟提醒和数据统计功能,帮助用户更好地管理自己的工作时间。

核心功能

  • 班次管理:创建、编辑和删除班次

  • 闹钟提醒:为不同班次设置闹钟

  • 数据统计:查看排班统计和分析

  • 个性化设置:自定义班次颜色和提醒方式

技术架构

目录结构

app/src/main/
├── java/com/schedule/assistant/
│   ├── data/
│   │   ├── dao/          # 数据访问对象
│   │   ├── entity/       # 数据实体类
│   │   ├── repository/   # 数据仓库
│   │   └── converter/    # 类型转换器
│   ├── ui/
│   │   ├── adapter/      # 列表适配器
│   │   ├── alarm/        # 闹钟管理
│   │   ├── calendar/     # 日历组件
│   │   ├── dialog/       # 对话框
│   │   ├── home/         # 主页
│   │   ├── profile/      # 个人中心
│   │   ├── shift/        # 班次管理
│   │   └── stats/        # 统计分析
│   ├── viewmodel/        # 视图模型
│   └── util/             # 工具类
├── res/
│   ├── layout/          # 布局文件
│   ├── drawable/        # 图形资源
│   ├── values/          # 资源值
│   └── navigation/      # 导航图
└── AndroidManifest.xml

系统架构图

┌──────────────────────────────── Application Layer ────────────────────────────────┐
│                                                                                  │
│  ┌────────────────────────────────── UI Layer ─────────────────────────────────┐ │
│  │                                                                             │ │
│  │  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐  │ │
│  │  │HomeFragment │    │ShiftFragment│    │AlarmFragment│    │StatsFragment│  │ │
│  │  │  Adapter    │    │  Adapter    │    │  Adapter    │    │  Adapter    │  │ │
│  │  │  Binding    │    │  Binding    │    │  Binding    │    │  Binding    │  │ │
│  │  └──────┬──────┘    └──────┬──────┘    └──────┬──────┘    └──────┬──────┘  │ │
│  │         │                  │                   │                   │         │ │
│  └─────────┼──────────────────┼───────────────────┼───────────────────┼─────────┘ │
│            │                  │                   │                   │           │
│  ┌─────────┼──────────────────┼───────────────────┼───────────────────┼─────────┐ │
│  │         │           ViewModel Layer            │                   │         │ │
│  │         ▼                  ▼                   ▼                   ▼         │ │
│  │  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐  │ │
│  │  │   HomeVM    │    │   ShiftVM   │    │   AlarmVM   │    │   StatsVM   │  │ │
│  │  │  LiveData   │    │  LiveData   │    │  LiveData   │    │  LiveData   │  │ │
│  │  │  Coroutine  │    │  Coroutine  │    │  Coroutine  │    │  Coroutine  │  │ │
│  │  └──────┬──────┘    └──────┬──────┘    └──────┬──────┘    └──────┬──────┘  │ │
│  │         │                  │                   │                   │         │ │
│  └─────────┼──────────────────┼───────────────────┼───────────────────┼─────────┘ │
│            │                  │                   │                   │           │
│  ┌─────────┼──────────────────┼───────────────────┼───────────────────┼─────────┐ │
│  │         │           Repository Layer           │                   │         │ │
│  │         ▼                  ▼                   ▼                   ▼         │ │
│  │  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐  │ │
│  │  │ ShiftRepo   │    │  AlarmRepo  │    │  StatsRepo  │    │  UserRepo   │  │ │
│  │  │   Cache     │    │   Cache     │    │   Cache     │    │   Cache     │  │ │
│  │  │   Sync      │    │   Sync      │    │   Sync      │    │   Sync      │  │ │
│  │  └──────┬──────┘    └──────┬──────┘    └──────┬──────┘    └──────┬──────┘  │ │
│  │         │                  │                   │                   │         │ │
│  └─────────┼──────────────────┼───────────────────┼───────────────────┼─────────┘ │
│            │                  │                   │                   │           │
│  ┌─────────┼──────────────────┼───────────────────┼───────────────────┼─────────┐ │
│  │         │           Data Source Layer          │                   │         │ │
│  │         ▼                  ▼                   ▼                   ▼         │ │
│  │  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐  │ │
│  │  │   Room DB   │    │   Shared    │    │    File     │    │   Remote    │  │ │
│  │  │   Entity    │    │   Prefs     │    │   System    │    │    API      │  │ │
│  │  │    DAO      │    │  Settings   │    │  Storage    │    │  Service    │  │ │
│  │  └─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘  │ │
│  │                                                                             │ │
│  └─────────────────────────────────────────────────────────────────────────────┘ │
│                                                                                  │
└──────────────────────────────────────────────────────────────────────────────────┘

数据流向图

数据流向:
┌──────────────┐    ┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│     UI       │ -> │  ViewModel   │ -> │  Repository  │ -> │ Data Source  │
│    Layer     │    │    Layer     │    │    Layer     │    │    Layer     │
└──────────────┘    └──────────────┘    └──────────────┘    └──────────────┘
       ▲                   │                   │                   │
       │                   │                   │                   │
       └───────────────────┴───────────────────┴───────────────────┘
                LiveData观察            异步数据流

数据处理流程:
1. UI Layer (表现层)
   ├─ 用户操作触发事件
   ├─ 调用ViewModel方法
   └─ 观察LiveData变化

2. ViewModel Layer (视图模型层)
   ├─ 处理UI逻辑和状态管理
   ├─ 调用Repository方法
   └─ 通过LiveData更新UI

3. Repository Layer (数据仓库层)
   ├─ 实现数据缓存策略
   ├─ 协调多数据源访问
   └─ 处理数据同步逻辑

4. Data Source Layer (数据源层)
   ├─ Room数据库操作
   ├─ SharedPreferences配置
   ├─ 文件系统访问
   └─ 远程API调用(预留)

架构说明

  1. UI Layer(表现层)

    • Fragment:页面展示和用户交互

    • Adapter:列表数据适配

    • ViewBinding:视图绑定

    • 采用单Activity多Fragment结构

  2. ViewModel Layer(视图模型层)

    • 管理UI状态和数据

    • 处理业务逻辑

    • 使用LiveData实现数据观察

    • 保证配置变更时的数据存活

  3. Repository Layer(数据仓库层)

    • 统一的数据访问接口

    • 数据来源的协调和调度

    • 实现数据缓存策略

    • 处理数据转换和业务规则

  4. Data Source Layer(数据源层)

    • Room:本地数据库存储

    • SharedPreferences:配置信息

    • FileSystem:文件存储

    • RemoteAPI:网络数据(预留)

关键特性

  • 单向数据流

  • 关注点分离

  • 依赖注入

  • 响应式编程

  • 可测试性设计

基础框架

  • 开发语言:Java 17

  • 最低SDK:Android 7.0 (API 24)

  • 目标SDK:Android 14 (API 34)

  • 构建工具:Gradle 8.2.0

架构模式

  • MVVM (Model-View-ViewModel)架构

  • Repository模式数据管理

  • 单Activity多Fragment结构

  • LiveData响应式编程

数据层

  • SQLite数据库

    • Room持久化库

    • DAO数据访问模式

    • 数据迁移策略

  • SharedPreferences配置存储

  • 文件存储系统

UI组件

  • AndroidX组件库

  • Material Design 3

  • RecyclerView + ListAdapter

  • ViewBinding视图绑定

  • CalendarView日历控件

  • ConstraintLayout布局

  • Navigation导航组件

功能组件

  • WorkManager任务调度

  • AlarmManager闹钟服务

  • NotificationManager通知管理

  • MPAndroidChart图表展示

  • FileProvider文件共享

工具支持

  • Kotlin协程(Java互操作)

  • Lifecycle组件

  • ViewPager2页面切换

  • SwipeRefreshLayout下拉刷新

  • BottomSheetDialog底部弹窗

测试框架

  • JUnit单元测试

  • Espresso UI测试

  • Mockito模拟测试

  • AndroidX Test测试支持库

技术实现细节

1. 数据流转与状态管理

数据流转示意:
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   View      │     │  ViewModel  │     │ Repository  │
│  (UI状态)    │ ←──  │  (数据转换) │ ←── │ (数据获取)   │
└─────────────┘     └─────────────┘     └─────────────┘
      │                    ↑                   ↑
      │                    │                   │
      └────────────────────┘                   │
         用户操作触发        数据库/网络/文件操作   │
                           ↑                   │
                           └───────────────────┘

2. 关键组件实现

  • 数据绑定机制

    // ViewModel:管理UI状态和数据
    public class HomeViewModel extends AndroidViewModel {
        private final MutableLiveData<List<ShiftTypeEntity>> shiftTypes = new MutableLiveData<>();
        private final ShiftTypeRepository shiftTypeRepository;
    
        public HomeViewModel(Application application) {
            super(application);
            shiftTypeRepository = new ShiftTypeRepository(application);
        }
    
        public LiveData<List<ShiftTypeEntity>> getShiftTypes() {
            return shiftTypeRepository.getAllShiftTypes();
        }
    }
    
    // Fragment:观察数据变化并更新UI
    public class HomeFragment extends Fragment {
        private HomeViewModel viewModel;
        private FragmentHomeBinding binding;
    
        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            viewModel = new ViewModelProvider(this).get(HomeViewModel.class);
    
            // 观察数据变化
            viewModel.getShiftTypes().observe(getViewLifecycleOwner(), shiftTypes -> {
                if (shiftTypes != null) {
                    updateShiftTypeDisplay(shiftTypes);
                }
            });
        }
    
        // UI更新方法
        private void updateShiftTypeDisplay(List<ShiftTypeEntity> shiftTypes) {
            // 更新UI显示
            binding.recyclerView.setAdapter(new ShiftTypeAdapter(shiftTypes));
        }
    }
  • 异步操作处理

    // Repository中的协程使用
    public class ShiftRepository {
        public LiveData<List<Shift>> getShifts() {
            return shiftDao.getAllShifts();  // Room自动在后台线程执行
        }
        
        public void insertShift(Shift shift) {
            executor.execute(() -> shiftDao.insert(shift));
        }
    }

3. 模块间通信

┌─────────────┐   Event Bus   ┌─────────────┐
│  Fragment A │ ────────────> │  Fragment B │
└─────────────┘               └─────────────┘
      ↑                            ↑
      │                            │
      └────────────────────────────┘
           共享ViewModel通信

通信方式:
1. LiveData观察
2. SharedViewModel共享
3. Navigation组件传参
4. EventBus消息

4. 数据缓存策略

┌─────────────┐
│  内存缓存     │ ← 首选
└─────────────┘
       ↓
┌─────────────┐
│  本地数据库   │ ← 持久化
└─────────────┘
       ↓
┌─────────────┐
│  网络请求     │ ← 备选
└─────────────┘

缓存策略:
1. 优先使用内存缓存
2. 内存缓存失效时访问数据库
3. 必要时请求网络更新

5. 错误处理机制

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   异常发生   │ ──>  │  错误转换    │ ──> │  UI展示     │
└─────────────┘     └─────────────┘     └─────────────┘
                          ↓
                    ┌─────────────┐
                    │  日志记录    │
                    └─────────────┘

错误处理流程:
1. 异常捕获与转换
2. 错误信息本地化
3. 用户友好提示
4. 日志记录追踪

6. 性能优化策略

性能优化要点:
┌────────────────────┐
│     UI渲染优化      │
├────────────────────┤
│ - ViewHolder复用   |
│ - 布局层级优化       │
│ - 按需加载          │
└────────────────────┘

┌────────────────────┐
│     数据加载优化     │
├────────────────────┤
│ - 分页加载          │
│ - 预加载机制         │
│ - 缓存策略          │
└────────────────────┘

┌────────────────────┐
│     内存优化        │
├────────────────────┤
│ - 内存泄漏监控       │
│ - 大对象延迟加载     │
│ - 及时释放资源       │
└────────────────────┘