如何仅在使用WorkManager的蜂窝网络上运行作业?

问题描述 投票:0回答:1

我正在开发一个在WiFi连接断开时必须运行作业的应用程序。我可以使用WorkManager轻松检测设备何时获得WiFi连接,但是我还没有找到一种方法来将Worker设置为仅在Cellular数据上运行,在检测到用户已连接到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,但没有找到仅在Cellular数据上运行Worker的方法。我是否缺少某些东西,或者当前是否无法使用WorkManagers?

android broadcastreceiver android-workmanager android-jobscheduler
1个回答
0
投票

您可以在有WIFI连接的情况下在运行的工作中创建一个具有Network.METERED约束的新WorkRequest。

[当设备切换到蜂窝(计量)连接时,将运行此新工作:

Network.METERED

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

© www.soinside.com 2019 - 2024. All rights reserved.