我正在开发一个在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?
您可以在有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()
。