Android: остановка / запуск службы в зависимости от состояния WiFi - PullRequest
21 голосов
/ 17 августа 2011

В приложении для Android, которое я разрабатываю, мой сервис должен работать только тогда, когда устройство подключено к маршрутизатору (очевидно, через WiFi).Я действительно новичок в Android, и то, что я получил до сих пор, навсегда привело меня в Achieve, поэтому я очень надеюсь на некоторые указатели.

Мой сервис настроен на запуск при запуске телефонавверх.Также, когда Activity запускается, он проверяет, работает ли служба - и если нет, то запускает ее.Мне просто интересно, какой код я могу добавить в свой сервис, чтобы отключить его, если состояние Wi-Fi потеряно - и какой код мне нужен для запуска сервиса, когда соединение WiFi станет активным?

Спасибо!:)

Ответы [ 4 ]

27 голосов
/ 17 августа 2011

Вы можете создать BroadcastReceiver , который обрабатывает изменения соединения Wi-Fi.

Точнее, вы захотите создать класс - скажем, NetWatcher:

public class NetWatcher extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //here, check that the network connection is available. If yes, start your service. If not, stop your service.
       ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
       NetworkInfo info = cm.getActiveNetworkInfo();
       if (info != null) {
           if (info.isConnected()) {
               //start service
               Intent intent = new Intent(context, MyService.class);
               context.startService(intent);
           }
           else {
               //stop service
               Intent intent = new Intent(context, MyService.class);
               context.stopService(intent);
           }
       }
    }
}

(изменяя MyService на название вашей услуги).

Кроме того, в вашем AndroidManifest необходимо добавить следующие строки:

<receiver android:name="com.example.android.NetWatcher">
     <intent-filter>
          <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
     </intent-filter>
</receiver>

(изменение com.example.androidна имя вашей посылки).

7 голосов
/ 17 августа 2011

Как сказано в @Phil, вы должны расширить BroadcastReceiver, а в методе onReceive запустить или остановить службу.Что-то вроде:

class ConnectionChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
            //start service
        } else {
            //stop service
        }
    }
}

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

2 голосов
/ 06 декабря 2012

Более полезная информация предоставлена ​​здесь: Определение и мониторинг состояния подключения

1 голос
/ 17 августа 2011

Чтобы запустить / остановить вашу услугу, когда соискатель в состоянии Wifi в порядке / nok:

  • зарегистрируйте BroadcastReceiver для получения переданных намерений изменения состояния WIFI
  • внутри вашего BroadCastReceiver проверьте правильность намерениязатем запустите свою услугу

Так зарегистрируйте свой широковещательный приемник, чтобы получать WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION.Добавить разрешение android.permission.CHANGE_WIFI_STATE или android.permission.ACCESS_NETWORK_STATE.Я не уверен, если это необходимо или нет.

Тогда пример кода приемника вещания может быть:

public class MyWifiStatereceiver extends BroadcastReceiver {
    //Other stuff here 

    @Override
    public void onReceive(Context context, Intent intent) {
       Intent srvIntent = new Intent();
       srvIntent.setClass(MyService.class);
       boolean bWifiStateOk = false;

       if (WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION.equals(intent.getAction()) {
           //check intents and service to know if all is ok then set bWifiStateOk accordingly
           bWifiStateOk = ... 
       } else {
           return ; // do nothing ... we're not in good intent context doh !
       }

       if (bWifiStateOk) {
           context.startService(srvIntent);
       } else {
           context.stopService(srvIntent);
       }
    }

}
...