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

Android 当手机处于睡眠状态时,如何防止Wifi断开?,android,Android,我有一个服务,它每隔一定时间轮询服务器。我使用AlarmManager和BroadcastReceiver启动服务。我的问题是,经过一段时间后,即使Wifi仍处于启用状态,但由于某些原因,我的应用程序无法与服务器联系。我收到一个“无法访问的网络”错误 注意,我已经获得了一个部分唤醒锁和一个wifilock 这是我的广播接收机代码 public class ServiceAlarmBroadcastReceiver extends BroadcastReceiver { public vo

我有一个服务,它每隔一定时间轮询服务器。我使用AlarmManager和BroadcastReceiver启动服务。我的问题是,经过一段时间后,即使Wifi仍处于启用状态,但由于某些原因,我的应用程序无法与服务器联系。我收到一个“无法访问的网络”错误

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

这是我的广播接收机代码

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

在WiFi设置、功能表键、高级选项和WiFi_SLEEP_策略选项列表下,设置为“永不”时,手机处于睡眠状态时,WiFi连接将保持打开状态

您可以在Settings.System软件包下操作此操作

希望这有帮助


汤姆

多亏了汤姆,我才解决了这个问题。代码如下:

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

这里发布的代码的问题在于,您从接收机的右侧获取并释放WakeLock和WifiLock。除非您是在服务的onStart中完成整个任务(如果是,为什么还要麻烦使用服务呢?),否则在轮询任务完成之前,锁将被释放

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

  • 让广播接收器启动服务(仅此而已)
  • 让服务获取唤醒锁并启动线程来执行轮询操作。最合适的地点是您的服务(创建时)
  • 完成轮询操作后,应停止轮询服务
  • 在服务的onDestroy中,您应该释放在onStart中获得的锁

  • 对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();
            }
        }
    
    private void setNeverSleepPolicy(){
    试一试{
    ContentResolver cr=getContentResolver();
    
    如果(Build.VERSION.SDK_INT),您如何确定问题在于WiFi连接处于休眠状态。一个“无法访问的网络”消息可能有其他原因。您是否观看了连接广播,或使用
    WifiManager
    检查了WiFi状态或其他任何东西来确认您的理论?感谢回复Tom。您实际上如何更改此设置?不建议为此更改用户设置。您应该等待释放唤醒/wifilock,直到y我们的工作完成了。好吧,假设我每6小时加入一次。在这个时间间隔内,设备可能处于睡眠模式,Wifi关闭。当我在onStart请求Wifi唤醒锁定时,它将启用Wifi,对吗?但由于Wifi连接到接入点需要几秒钟的时间,我的服务是否无法连接到internet?如果用户启用Wifi时,它不会仅仅因为您获得了锁定而重新连接。否则,您可以等到活动网络再次连接后再尝试连接您的服务。Wifi不会花费很长时间准备就绪,因为它在睡眠模式下没有完全断开连接。事实上,我不确定ConnectionManager是否报告其未连接在这种情况下反恐执行局。嗨,贾斯汀,我认为有一个很好的解决方案,就是注册一个BroadcastReceiver,检测何时建立wifi连接,然后检查最后一次下载是否超过12小时(我的池间隔),如果是,它将下载。这实际上看起来很糟糕-电池方面。将wifi锁移动到服务实现中如何?您的服务是a吗?您在接收器中获得的唤醒锁不会起多大作用上面的代码需要以下权限:注意,从API 17开始,这是不推荐的。请参阅更改用户的设置不建议对此进行设置。您应该等待释放唤醒/wifilock,直到作业完成。