# WiFi 强制连接完善说明 ## 📋 修改概述 根据需求,确保**进入锁定app时,无论是正常启动还是开机自启动,都必须检测WiFi连接状态**,并且**必须连接WiFi才能继续使用**。 ## ✅ 已完成的修改 ### 修改文件 - `app/src/main/java/com/YuyeTech/HeartRate/MyApplication.java` ### 修改内容 #### 1. onCreate 阶段 - WiFi 检测扩展到所有主 Activity **修改前:** ```java // ✅ 检测 WiFi 连接(仅对 PandoraEntryActivity) if (activity instanceof io.dcloud.PandoraEntryActivity) { Log.d(TAG, "🔍 开始检测 WiFi 连接..."); WifiCheckHelper.checkWifiOnActivityStart(activity); } ``` **修改后:** ```java // ✅ 检测 WiFi 连接(对所有主 Activity 都检测,包括 PandoraEntry 和 PandoraEntryActivity) Log.d(TAG, "🔍 开始检测 WiFi 连接: " + activity.getClass().getSimpleName()); WifiCheckHelper.checkWifiOnActivityStart(activity); ``` #### 2. onResume 阶段 - WiFi 检测扩展到所有主 Activity **修改前:** ```java // ✅ 在 onResume 时检测 WiFi(每次恢复都检测,包括从设置返回) if (activity instanceof io.dcloud.PandoraEntryActivity) { Log.d(TAG, "📱 PandoraEntryActivity onResume → 开始 WiFi 检测"); WifiCheckHelper.checkWifiOnActivityResume(activity); } ``` **修改后:** ```java // ✅ 在 onResume 时检测 WiFi(每次恢复都检测,包括从设置返回、开机启动等所有情况) Log.d(TAG, "📱 " + activity.getClass().getSimpleName() + " onResume → 开始 WiFi 检测"); WifiCheckHelper.checkWifiOnActivityResume(activity); ``` ## 🎯 功能说明 ### 1. WiFi 检测覆盖所有入口 现在 WiFi 检测会在以下所有情况下触发: | 启动方式 | 触发的 Activity | WiFi 检测时机 | |---------|----------------|--------------| | 用户点击图标启动 | PandoraEntry → PandoraEntryActivity | onCreate + onResume | | 开机自启动 | PandoraEntryActivity(直接启动) | onCreate + onResume | | 从其他应用返回 | PandoraEntry 或 PandoraEntryActivity | onResume | | 从WiFi设置返回 | PandoraEntry 或 PandoraEntryActivity | onResume | ### 2. WiFi 强制连接机制 #### 检测流程 ``` Activity 启动/恢复 ↓ 检测 WiFi 连接状态 ↓ 未连接 → 显示强制对话框(不可取消) ↓ 用户选择: ├─ "去设置" → 跳转到 WiFi 设置 │ ↓ │ 用户返回(按返回键) │ ↓ │ onResume 触发 │ ↓ │ 重新检测 WiFi │ ↓ │ ├─ 仍未连接 → 再次显示对话框(循环) │ └─ 已连接 → 检测通过 ✅ │ └─ "不再提示" → 保存用户选择,以后不再提示 ``` #### 对话框特性 - ✅ **不可取消**:点击对话框外部无效,必须做出选择 - ✅ **强制连接**:只有连接WiFi或选择"不再提示"才能继续 - ✅ **循环检测**:从设置返回后自动重新检测,未连接则继续提示 - ✅ **用户友好**:提供"不再提示"选项,避免过度打扰 ### 3. 开机自启动 + WiFi 检测 #### 完整流程 ``` 设备开机 ↓ BootReceiver 接收广播 ↓ BootLauncher 启动 StartService ↓ StartService 启动 PandoraEntryActivity ↓ MyApplication.onActivityCreated() 触发 ↓ ├─ 绑定 Kiosk 模式 ├─ 禁用锁屏 ├─ 屏幕常亮 ├─ 拦截返回键 └─ ✅ 检测 WiFi 连接(延迟 2 秒) ↓ MyApplication.onActivityResumed() 触发 ↓ └─ ✅ 再次检测 WiFi 连接(500ms 延迟) ↓ 未连接 → 显示强制对话框 已连接 → 正常使用 ✅ ``` ## 📝 日志输出示例 ### 正常启动(WiFi 已连接) ``` D MyApplication: Application 初始化 D MyApplication: ✅ 绑定 Kiosk 到: PandoraEntryActivity D MyApplication: 🔍 开始检测 WiFi 连接: PandoraEntryActivity D WifiCheckHelper: WiFi 连接状态: true D WifiCheckHelper: ✅ WiFi 已连接或 Activity 已结束 D MyApplication: 📱 PandoraEntryActivity onResume → 开始 WiFi 检测 D WifiCheckHelper: ✅ onResume 时 WiFi 已连接 ``` ### 开机启动(WiFi 未连接) ``` D BootReceiver: 收到启动广播:android.intent.action.BOOT_COMPLETED D BootLauncher: 准备启动 StartService... D StartService: onStartCommand: Service started. D StartService: Launching activity from LaunchConfig: io.dcloud.PandoraEntryActivity D MyApplication: ✅ 绑定 Kiosk 到: PandoraEntryActivity D MyApplication: 🔍 开始检测 WiFi 连接: PandoraEntryActivity D WifiCheckHelper: WiFi 连接状态: false D WifiCheckHelper: ⚠️ WiFi 未连接,显示提示对话框(必须连接) D WifiCheckHelper: ✅ WiFi 未连接对话框已显示(必须连接) D MyApplication: 📱 PandoraEntryActivity onResume → 开始 WiFi 检测 D WifiCheckHelper: ⚠️ onResume 时 WiFi 未连接 ``` ### 从 WiFi 设置返回(仍未连接) ``` D WifiCheckHelper: 用户选择:去设置 D WifiCheckHelper: 📌 已标记需要重新检测 WiFi(onResume 时触发) D MyApplication: 📱 PandoraEntryActivity onResume → 开始 WiFi 检测 D WifiCheckHelper: ⚠️ onResume 时 WiFi 未连接 D WifiCheckHelper: ⚠️ WiFi 仍未连接,显示提示对话框(强制) ``` ### 从 WiFi 设置返回(已连接) ``` D WifiCheckHelper: 用户选择:去设置 D WifiCheckHelper: 📌 已标记需要重新检测 WiFi(onResume 时触发) D MyApplication: 📱 PandoraEntryActivity onResume → 开始 WiFi 检测 D WifiCheckHelper: ✅ onResume 时 WiFi 已连接 ``` ## 🔧 技术细节 ### WiFi 检测时机 1. **onCreate 阶段**(延迟 2 秒) - 目的:避免影响启动速度 - 时机:Activity 创建完成,UI 完全加载后 - 适用:首次启动、开机自启动 2. **onResume 阶段**(延迟 500ms) - 目的:确保从设置返回后立即检测 - 时机:Activity 恢复到前台 - 适用:从 WiFi 设置返回、从其他应用返回 ### 为什么要检测两个 Activity? 1. **PandoraEntry**(启动页) - 用户手动点击图标时会先启动这个页面 - 虽然会自动跳转到 PandoraEntryActivity,但仍需检测 - 确保用户在启动页停留期间也能看到 WiFi 提示 2. **PandoraEntryActivity**(主页面) - 开机自启动直接启动这个页面(跳过启动页) - 应用的主要运行页面 - 必须检测以确保开机启动时的 WiFi 连接 ## ✅ 测试验证 ### 1. 测试开机自启动 + WiFi 检测 #### 方法 1:模拟开机广播 ```bash # 断开 WiFi adb shell svc wifi disable # 模拟开机广播 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.YuyeTech.HeartRate # 查看日志 adb logcat | findstr "WiFi\|MyApplication\|BootReceiver" ``` #### 方法 2:实际重启设备 ```bash # 断开 WiFi adb shell svc wifi disable # 重启设备 adb reboot # 设备重启后查看日志 adb logcat | findstr "WiFi\|MyApplication\|BootReceiver" ``` ### 2. 测试正常启动 + WiFi 检测 ```bash # 断开 WiFi adb shell svc wifi disable # 启动应用 adb shell am start -n com.YuyeTech.HeartRate/io.dcloud.PandoraEntry # 查看日志 adb logcat | findstr "WiFi\|MyApplication" ``` ### 3. 测试从 WiFi 设置返回 1. 断开 WiFi 2. 启动应用,会显示 WiFi 提示对话框 3. 点击"去设置" 4. 在 WiFi 设置中**不连接 WiFi**,直接按返回键 5. 应该再次显示 WiFi 提示对话框(循环检测) 6. 再次点击"去设置",这次**连接 WiFi** 7. 按返回键返回应用 8. 应该不再显示对话框,正常使用 ✅ ## 📋 相关文件 | 文件 | 说明 | |------|------| | `MyApplication.java` | 应用入口,注册生命周期监听,触发 WiFi 检测 | | `WifiCheckHelper.java` | WiFi 检测工具类,提供检测和对话框功能 | | `BootReceiver.java` | 开机广播接收器 | | `BootLauncher.java` | 开机启动调度器 | | `StartService.java` | 开机启动服务,负责启动 Activity | | `LaunchConfig.java` | 启动配置,指定启动哪个 Activity | ## 🎉 总结 现在应用已经实现了**全方位的 WiFi 强制连接检测**: ✅ **所有启动方式都检测**:正常启动、开机自启动、从其他应用返回 ✅ **所有主 Activity 都检测**:PandoraEntry、PandoraEntryActivity ✅ **所有生命周期都检测**:onCreate、onResume ✅ **强制连接机制**:不可取消对话框 + 循环检测 ✅ **用户友好**:提供"不再提示"选项 ✅ **开机自启动集成**:开机后自动启动并检测 WiFi **用户体验**:无论用户如何启动应用(包括开机自启动),都会确保 WiFi 连接,保证应用正常运行。