基于纯java语言开发的排班助手APP
现已开源
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调用(预留)
架构说明
UI Layer(表现层)
Fragment:页面展示和用户交互
Adapter:列表数据适配
ViewBinding:视图绑定
采用单Activity多Fragment结构
ViewModel Layer(视图模型层)
管理UI状态和数据
处理业务逻辑
使用LiveData实现数据观察
保证配置变更时的数据存活
Repository Layer(数据仓库层)
统一的数据访问接口
数据来源的协调和调度
实现数据缓存策略
处理数据转换和业务规则
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复用 |
│ - 布局层级优化 │
│ - 按需加载 │
└────────────────────┘
┌────────────────────┐
│ 数据加载优化 │
├────────────────────┤
│ - 分页加载 │
│ - 预加载机制 │
│ - 缓存策略 │
└────────────────────┘
┌────────────────────┐
│ 内存优化 │
├────────────────────┤
│ - 内存泄漏监控 │
│ - 大对象延迟加载 │
│ - 及时释放资源 │
└────────────────────┘