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

时间:2010-10-06 11:09:40

标签: 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!");
                }
            }
        }
    }
}

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

感谢Tom,我能够解决这个问题。这是代码:

Settings.System.putInt(getContentResolver(),
  Settings.System.WIFI_SLEEP_POLICY, 
  Settings.System.WIFI_SLEEP_POLICY_NEVER);

答案 2 :(得分:0)

在WiFi设置,菜单键,高级选项下,WIFI_SLEEP_POLICY选项列表设置为永不会在手机处于睡眠状态时保持WiFi连接打开。

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

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

希望这有帮助,

汤姆

答案 3 :(得分:0)

对javauser的答案进行一点编辑:

private void setNeverSleepPolicy() {
        try {
            ContentResolver cr = getContentResolver();
            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) {
                int set = android.provider.Settings.System.WIFI_SLEEP_POLICY_NEVER;
                android.provider.Settings.System.putInt(cr, android.provider.Settings.System.WIFI_SLEEP_POLICY, set);
            } else {
                int set = android.provider.Settings.Global.WIFI_SLEEP_POLICY_NEVER;
                android.provider.Settings.System.putInt(cr, android.provider.Settings.Global.WIFI_SLEEP_POLICY, set);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }