Обнаружить, что пользователь отключился от Wi-Fi в Android Nougat

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

Как всем известно, после Android 7.0 наши BroadcastsReceveirs больше не запускаются при отправке широковещательного намерения CONNECTIVITY_ACTION. Зарегистрировать BroadcastReceiver вручную/программно невозможно, так как мое приложение работает в фоновом режиме.

Я попытался запланировать JobService, который хорошо работает, когда пользователь переходит в сеть Wi-Fi (требование NETWORK_TYPE_UNMETERED), но не работает, когда пользователь выходит из WiFi прямо в состояние с интернета нет вообще. Например, если у пользователя НЕТ SIM-карты.

JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(new JobInfo.Builder(JOB_ID,
   new ComponentName(this, NoInternetJobService.class))
   .setRequiredNetworkType(JobInfo.NETWORK_TYPE_METERED)
   .build());

В приведенном выше примере мой JobService будет запущен, если пользователь выскочит из WiFi и подключится к ИЗМЕРЕННОМУ соединению (SIM-карта с включенными данными).

Некоторые из вас могут сказать, используйте JobInfo.NETWORK_TYPE_NONE для сетевых требований, но это просто значение по умолчанию для запланированного задания. Я в основном говорю jobScheduler, чтобы он не смотрел параметры сети для запуска моей работы, потому что мне вообще не нужен интернет. Таким образом, он будет выполнен в тот момент, когда я запланирую его, поскольку у меня нет других требований.

Какие-нибудь мысли? Я начинаю думать, что это невозможно сделать в Nougat или выше.


comment
Я не думаю, что есть надежное решение для всего, что работает в фоновом режиме (= не на переднем плане) в последних версиях Android.   -  person M66B    schedule 03.09.2017
comment
Я новичок в андроиде. Я могу сказать вам способ, но я не уверен, работает он или нет. Запланируйте выполнение задания при подключении пользователя к WIFI. И в этом задании запланируйте выполнение задания при отсутствии подключения (используя JobInfo.NETWORK_TYPE_NONE). Поэтому я думаю, что это работает, потому что вы планируете задание, когда у пользователя есть подключение к Wi-Fi, и оно не будет запущено немедленно. Он срабатывает только тогда, когда пользователь перешел с Wi-Fi на отсутствие сети.   -  person Ajay Naredla    schedule 08.09.2017
comment
Пожалуйста, прочитайте мой вопрос еще раз. NETWORK_TYPE_NONE — значение по умолчанию. Он будет выполнен сразу. Некоторые из вас могут сказать, используйте JobInfo.NETWORK_TYPE_NONE для сетевых требований, но это просто значение по умолчанию для запланированного задания. Я в основном говорю jobScheduler, чтобы он не смотрел параметры сети для запуска моей работы, потому что мне вообще не нужен интернет.   -  person febaisi    schedule 11.09.2017


Ответы (1)


Решение. Слушайте трансляцию android.net.wifi.STATE_CHANGE вместо намерений android.net.conn.CONNECTIVITY_CHANGE.

person febaisi    schedule 21.02.2018