Как мне отключить Wi-Fi, когда телефон спит? - PullRequest
7 голосов
/ 06 октября 2010

У меня есть служба, которая опрашивает сервер через определенные промежутки времени. Я использую AlarmManager и BroadcastReceiver для запуска службы. Моя проблема в том, что через определенное время, хотя Wi-Fi все еще включен, но по какой-то причине мое приложение не может связаться с сервером. Я получаю сообщение об ошибке «Недоступная сеть».

Обратите внимание, что я уже приобрел частичную блокировку после пробуждения и вайфлок.

Вот мой код для 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 ]

7 голосов
/ 16 марта 2011

Проблема с кодом, размещенным здесь, заключается в том, что вы приобретаете и выпускаете WakeLock и WifiLock прямо из приемника. Если вы не завершите всю свою задачу в рамках запуска службы (что, если вы, зачем вообще беспокоиться о наличии службы ???), блокировки будут сняты до завершения задачи опроса.

Я бы предложил изменить вашу реализацию на что-то вроде следующего:

  1. Имейте службу запуска приемника вещания (и это все)
  2. Сделайте так, чтобы служба приобрела блокировку от пробуждения и начала работу, чтобы выполнить операцию опроса. Наиболее подходящим местом будет ваш сервис onCreate)
  3. После завершения опроса вы должны прекратить работу опроса
  4. В onDestroy вашего сервиса вы должны снять блокировки, которые вы приобрели в onStart
3 голосов
/ 06 октября 2010

Благодаря Тому я смог решить эту проблему.Вот код:

Settings.System.putInt(getContentResolver(),
  Settings.System.WIFI_SLEEP_POLICY, 
  Settings.System.WIFI_SLEEP_POLICY_NEVER);
0 голосов
/ 09 января 2014

Небольшое изменение к ответу 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();
        }
    }
0 голосов
/ 06 октября 2010

В разделе «Настройки Wi-Fi», «Клавиша меню», «Дополнительные параметры» представлен список параметров WIFI_SLEEP_POLICY, который при установке «никогда» не будет поддерживать соединение WiFi открытым, когда телефон спит.

Вы можете управлять этим в меню «Настройки». Пакет системы.

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

Надеюсь, это поможет,

Том

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...