手机在睡着时,如何防止Wifi断开连接?

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

请注意,我已经获得了部分唤醒锁以及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!"); } } } } } 

Solutions Collecting From Web of "手机在睡着时,如何防止Wifi断开连接?"

这里发布的代码的问题是,您从接收器内部获取并释放WakeLock和WifiLock。 除非你正在完成你的服务的onStart(如果你是,为什么还要麻烦有一个服务???)的整个任务,锁将在您的轮询任务完成之前释放。

我会build议改变你的实现如下所示:

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

感谢汤姆,我能够解决这个问题。 代码如下:

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

在WiFi设置,菜单键,高级选项下的WIFI_SLEEP_POLICY选项列表,当设置为永不会保持WiFi连接打开,而手机睡着了。

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

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

希望这可以帮助,

汤姆

对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(); } }