Android: остановить/запустить сервис в зависимости от состояния WiFi?
В приложении Android, которое я разрабатываю, моя служба должна быть запущена только тогда, когда устройство подключено к маршрутизатору (очевидно, через Wi-Fi).
Я действительно новичок в андроиде, и то, что у меня есть до сих пор, навело меня навсегда для достижения, поэтому я действительно надеюсь на некоторые указатели.
Моя служба настроена на запуск при запуске телефона. Также, когда запускается Activity, она проверяет, работает ли служба, и если она не запускается.
Мне просто интересно, какой код я могу внести в свою службу, чтобы отключить его, если состояние Wi-Fi потеряно, - и какой код мне нужно сделать, чтобы запустить услугу, как только соединение WiFi станет активным?
Спасибо!:)
Ответы
Ответ 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
}
}
}
Вы можете сделать это частным классом своей деятельности и зарегистрировать получателя при создании активности и отменить регистрацию на активность.
Ответ 3
Более полезная информация приведена здесь: Определение и мониторинг состояния подключения
Ответ 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);
}
}
}