Подтвердить что ты не робот

Android: остановить/запустить сервис в зависимости от состояния WiFi?

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

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

Спасибо!:)

4b9b3361

Ответ 1

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

Чтобы быть более точным, вы захотите создать класс - скажем, 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 на имя вашего пакета).

Ответ 2

Как указано в @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
        }
    }
}

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

Ответ 4

Чтобы запустить/остановить свой сервис, когда запрашивается состояние 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);
       }
    }

}