Files
cmautobuy/docs/task/22-保存当前使用的-android-设备.md

3.8 KiB

22 保存当前使用的 Android 设备

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 状态:已完成
  • 日期:2026-08-07
  • Gitea 工单:#22

背景与目标

Android 设备搜索结果原来只存在于界面内存中。此次补齐“保存”和“删除”行为,使 Client 重启后仍知道自动化应该使用哪台 Android 设备。

最终方案

  • 只在现有 app_settings 表保存 android.selected_serial,不保存容易过期的搜索列表、在线状态、型号和 Android 版本。
  • 勾选设备只是临时选择;点击“保存”且写入成功后,才成为当前使用设备。
  • 页面启动时通过一次简单的索引查询恢复设备号;搜索后若设备在线则自动勾选,离线时保留配置并提示用户。
  • 保存和删除由 QObject + moveToThread Worker 在后台写入 SQLite,防止阻塞 Qt 主线程并避免重复提交。
  • 写入失败时保留原配置和当前临时选择;页面关闭后忽略迟到结果。
  • “删除”只清除本地设置,不执行 ADB 断开,也不删除手机或 PDD 数据。
  • 没有新增数据库迁移、Admin 接口和第三方依赖。

工单最初把所有 SQLite 读写都计划为后台任务。实现时按现有设置页启动方式,将一次少量、带索引的启动读取保留为同步操作;可能阻塞的保存和删除仍在后台执行。该调整减少了初级维护人员需要理解的线程状态,不改变用户功能。

本任务只补全现有设置页行为,没有调整布局,因此按 Windows UI/UX 规范跳过 HTML 原型。

改了哪些

  • client/src/selected_android_device_service.py:设置键、设备号校验、读取、保存和删除。
  • client/src/settings_ui_event.py:启动恢复、后台写入、搜索后自动选择、离线提示及线程关闭保护。
  • client/test/test_selected_android_device_service.py:覆盖设置服务的正常、异常和删除边界。
  • client/test/test_settings_ui_event.py:覆盖保存、恢复、在线/离线搜索、失败保留、删除、重复提交和关闭安全。

验收结果

验收标准 结果
保存后 android.selected_serial 等于所选设备号 通过
重新创建页面后恢复已保存设备号 通过
已保存设备在线时搜索后自动勾选 通过
已保存设备离线时保留配置并明确提示 通过
搜索结果、状态、型号和版本不写入数据库 通过
未勾选设备时不能保存 通过
保存失败时原配置和临时选择不变 通过
删除只清除当前设备设置,不执行 ADB 操作 通过
保存和删除防止重复提交,主线程保持响应 通过
页面关闭后忽略迟到写入结果 通过
不新增迁移、Admin 接口和第三方依赖 通过
全量测试、语法检查和差异检查 通过

测试

  • 执行的命令:
C:/Python310/python.exe -m py_compile client/src/selected_android_device_service.py client/src/settings_ui_event.py client/test/test_selected_android_device_service.py client/test/test_settings_ui_event.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
git diff --check
  • 结果:Client 全量 74 项测试通过;语法检查和差异检查通过。
  • 用户已完成真实设备流程验收。
  • 没验证到的部分:未检查打包后的 exe;Narrator、高对比度和 200% 缩放未做人工检查;数据库失败场景使用测试替身模拟。

测试环境仍会输出现有 PyQt5 字体目录缺失和 SIP API 弃用警告,不影响测试结果。

相关提交

  • 27a09e5 feat: 保存当前使用的 Android 设备 (#22)