当手机处于睡眠状态时,如何防止Wifi断开连接?

jav*_*ser 7 android

我有一个服务,以一定的间隔轮询服务器.我使用AlarmManager和BroadcastReceiver来启动服务.我的问题是,经过一段时间后,即使Wifi仍然启用,但由于某种原因,我的应用程序无法联系服务器.我收到"无法访问的网络"错误.

请注意,我已经获得了部分唤醒锁和wifilock.

这是我的BroadcastReceiver代码.

public class ServiceAlarmBroadcastReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        WakeLock wakeLock = null;
        WifiLock wifiLock = null;
        try {
            PowerManager pm = (PowerManager) context
                    .getSystemService(Context.POWER_SERVICE);

            // acquire a WakeLock to keep the CPU running
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "MyWakeLock");
            if(!wakeLock.isHeld()){
                wakeLock.acquire();
            }

            Log.i("ServiceAlarmBroadcastReceiver", "WakeLock acquired!");


            WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL , "MyWifiLock");
            if(!wifiLock.isHeld()){
                wifiLock.acquire();
            }

            Log.i("ServiceAlarmBroadcastReceiver", "WifiLock acquired!");
            context.startService(new Intent(context, ThePollerService.class));
        } finally {
            // release the WakeLock to allow CPU to sleep
            if (wakeLock != null) {
                if (wakeLock.isHeld()) {
                    wakeLock.release();
                    Log.i("ServiceAlarmBroadcastReceiver", "WakeLock released!");
                }
            }

            // release the WifiLock
            if (wifiLock != null) {
                if (wifiLock.isHeld()) {
                    wifiLock.release();
                    Log.i("ServiceAlarmBroadcastReceiver", "WiFi Lock released!");
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ler 7

此处发布的代码的问题是您从接收器内部获取并释放WakeLock和WifiLock.除非你在服务的onStart中完成整个任务(如果你是这样,为什么甚至打扰服务???),锁定将在你的轮询任务完成之前被释放.

我建议将您的实现更改为以下内容:

  1. 有广播接收器启动服务(这就是全部)
  2. 服务获取唤醒锁定并启动线程以执行轮询操作.最合适的地方是你的服务onCreate)
  3. 轮询操作完成后,您应该停止轮询服务
  4. 在服务的onDestroy中,您应该释放在onStart中获取的锁


小智 0

在 WiFi 设置、菜单键、高级选项下,有 WIFI_SLEEP_POLICY 选项列表,当设置为从不时,将在手机睡眠时保持 WiFi 连接打开。

您可以在 Settings.System Package 下操作它。

http://developer.android.com/reference/android/provider/Settings.System.html#WIFI_SLEEP_POLICY

希望这可以帮助,

汤姆