Приостановка услуги до установления интернет-соединения - PullRequest
5 голосов
/ 12 февраля 2012

У меня есть служба, которая запускается после завершения загрузки.Эта услуга требует подключения к интернету.Как лучше всего ждать, пока устройство подключится к Интернету?Мобильный телефон Wi-Fi на самом деле не имеет значения.

Мое текущее решение включает цикл while, который просто проверяет ConnectivityManager, пока одна из сетей не станет доступной, но это кажется вульгарным.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2013

но это кажется вульгарным

Действительно: D

  1. Ваш приемник пробуждает вашу службу бодрствования (вероятно, подойдет служба простой интенции, так как телефон не спит во время загрузки AFAIK)
  2. служба регистрирует получателя для подключения
  3. служба ожидает CountDownLatch
  4. Приемник активирует услугу при подключении к Wi-Fi

Код скелета: https://stackoverflow.com/a/19968708/281545 - ваш случай проще, так как вам не нужно будить Wi-Fi, удерживать блокировки Wi-Fi и т.д. служба простого намерения не подойдет) между 2 и 3 вам потребуется:

2a. услуга приобретает блокировку wifi
2b. сервисные вызовы reconnect(), reassociate() и все, что нужно (это может зависеть от устройства)

1 голос
/ 12 февраля 2012

Вы можете использовать BroadcastReceiver:

private class ConnectionMonitor extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
            return;
        boolean noConnectivity = intent.getBooleanExtra(
            ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        NetworkInfo aNetworkInfo = (NetworkInfo) intent
            .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        if (!noConnectivity) {
            if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
                || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) {
                // start your service stuff here
            }
        } else {
            if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
                || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) {
                // stop your service stuff here
            }
        }
    }
}

Затем вы создаете экземпляр где-то в своем коде:

ConnectionMonitor connectionMonitor = new ConnectionMonitor();
registerReceiver(connectionMonitor, intentFilter);

Примечание: этот код взят из Обнаружение восстановления сети 3G или Wifi

...