You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 2
    
    注:wifi_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:27:45