Как запустить задание только в сотовой сети с помощью WorkManager? - PullRequest
0 голосов
/ 07 января 2020

Я разрабатываю приложение, которое должно запускать задание при потере соединения WiFi. Я легко могу определить, когда устройство получает WiFi-соединение, с помощью WorkManager, но я не нашел способа настроить Worker на работу только с сотовыми данными, который я установил бы сразу после обнаружения подключения пользователя к сети WiFi.

То, как я это делал, использовало BroadcastReceivers, которые сообщали мне, когда пользователь подключался или отключался от сети WiFi.

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<receiver android:name=".NetworkChangeReceiver">
   <intent-filter>
      <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE"/>
   </intent-filter>
</receiver>

К сожалению, в API 28 SUPPLICANT_CONNECTION_CHANGE_ACTION устарело.

К счастью, в API 28 теперь я могу использовать JobScheduler для достижения аналогичного эффекта, настраивая работу следующим образом:

val jobBuilder = JobInfo.Builder(jobId, ComponentName(context, NetworkService::class.java))
val requiredNetwork = NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR).build()
jobBuilder.setRequiredNetwork(requiredNetwork)

Я знаю, что могу объединить два решения и использовать одно или другое в соответствии с API устройства, но я бы хотел этого избежать. Я посмотрел на WorkManager, но не нашел способ запустить Worker только при работе с данными Cellular. Я что-то упустил или это в настоящее время невозможно с WorkManagers?

1 Ответ

0 голосов
/ 07 января 2020

ОБНОВЛЕНИЕ Если вы можете предположить, что сотовая сеть всегда измеряется, а WiFi всегда неизмерен, вы можете использовать эти NetworkTypes в качестве ограничений. См. Комментарии для более подробной информации, так как кажется, что это не всегда так.

Исходный ответ

Вы можете создать новый WorkRequest с Network.METERED ограничения в Работе, выполняемой при наличии соединения WIFI.

Эта новая работа будет запущена, когда устройство переключится на сотовое (дозированное) соединение:

// Create a Constraints object that defines when the task should run
val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.METERED)
        .build()

Руководство WorkManager охватывает WorkRequests с ограничениями .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...