我正在开发一个在WiFi连接丢失时必须运行作业的应用程序。我可以通过使用WorkManager很容易地检测到设备何时连接到WiFi,但我还没有找到一种方法来设置工作人员只在蜂窝数据上运行,我会在检测到用户连接到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>不幸的是,在API28中,SUPPLICANT_CONNECTION_CHANGE_ACTION已被弃用。
不过,值得庆幸的是,在API28中,我现在可以使用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的方法。我是否遗漏了什么,或者这在WorkManagers中目前是不可能的吗?
发布于 2020-01-07 18:19:40
更新如果您可以假设蜂窝网络始终是计量的,而WiFi始终是非计量的,则可以使用这些NetworkTypes作为约束。有关更多细节,请参阅注释,因为似乎情况并不总是如此。
原始答案
您可以在有WIFI连接时运行的工作中创建一个带有Network.METERED约束的新WorkRequest。
这项新工作将在设备切换到蜂窝(计量)连接时运行:
// Create a Constraints object that defines when the task should run
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.METERED)
.build()https://stackoverflow.com/questions/59621533
复制相似问题