Android 12嵌入式设备休眠时无法自动重连WiFi问题求助
问题与解决方案:Android 12嵌入式设备休眠时WiFi自动重连
问题描述
- 受PCI合规要求,设备需强制24小时重启一次;
- 重启时若WiFi不可用,设备会在未连接WiFi的状态下进入休眠;
- 休眠状态下仅当设备唤醒后,WiFi连接才会重新建立;
- 同款Android 9设备无此问题,休眠时WiFi可用会立即重连;
- 已尝试使用
WifiLock但未解决问题,代码如下:
val wifiLock by lazy { (getSystemService(Context.WIFI_SERVICE) as WifiManager).createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "Controller:WifiLock") } wifiLock.acquire() wifiLock.release()
解决方案
1. 调整系统WiFi休眠策略
Android 12对后台WiFi访问做了更严格的电量优化限制,默认休眠时会切断WiFi连接。可通过以下方式修改:
- 若设备有可视化设置界面:进入设置 > 网络和互联网 > WiFi > 高级,将「休眠时保持WiFi连接」设置为「始终」;
- 若为无界面嵌入式设备:通过ADB命令修改系统属性
注:adb shell settings put global wifi_sleep_policy 2wifi_sleep_policy取值说明:0=默认(休眠时断开),1=仅充电时保持,2=始终保持。
2. 修复WifiLock使用逻辑
你当前的代码中acquire()后立即release(),相当于未实际持有锁。需在需要保持WiFi连接的周期内持续持有:
// 在Application或后台Service的初始化阶段创建锁 private lateinit var wifiLock: WifiLock override fun onCreate() { super.onCreate() val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "Controller:WifiLock") // 持续持有锁直到应用退出或不再需要 wifiLock.acquire() } override fun onDestroy() { super.onDestroy() if (wifiLock.isHeld) { wifiLock.release() } }
同时需在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
3. 用JobScheduler监听WiFi状态并触发重连
通过系统调度任务,在WiFi可用时自动触发重连操作,无需依赖设备唤醒:
class WifiReconnectJobService : JobService() { override fun onStartJob(params: JobParameters): Boolean { val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager // 检测WiFi已启用但未连接时,触发重连 if (wifiManager.isWifiEnabled && !wifiManager.isConnected) { wifiManager.reconnect() } jobFinished(params, false) return false } override fun onStopJob(params: JobParameters): Boolean { return false } }
在AndroidManifest.xml注册服务:
<service android:name=".WifiReconnectJobService" android:permission="android.permission.BIND_JOB_SERVICE" />
在应用中调度任务(可放在Application初始化或启动逻辑中):
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler val jobInfo = JobInfo.Builder(1, ComponentName(this, WifiReconnectJobService::class.java)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) // 指定监听WiFi网络 .setPersisted(true) // 设备重启后任务仍保留 .build() jobScheduler.schedule(jobInfo)
4. 排查厂商定制化限制
嵌入式设备可能被厂商修改了系统WiFi行为,需联系设备厂商获取定制化文档,确认是否存在特殊休眠策略或需要开启专属系统权限。
内容的提问来源于stack exchange,提问作者Ariczek
相关产品推荐
相关产品推荐

