首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅在使用WorkManager的蜂窝网络上运行作业?

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

Stack Overflow用户
提问于 2020-01-07 10:44:15
回答 1查看 250关注 0票数 0

我正在开发一个在WiFi连接丢失时必须运行作业的应用程序。我可以通过使用WorkManager很容易地检测到设备何时连接到WiFi,但我还没有找到一种方法来设置工作人员只在蜂窝数据上运行,我会在检测到用户连接到WiFi网络后立即设置。

我过去的做法是使用BroadcastReceivers,当用户连接或断开WiFi网络时,它会让我知道。

代码语言:javascript
复制
<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来实现类似的效果,设置如下作业:

代码语言:javascript
复制
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中目前是不可能的吗?

EN

回答 1

Stack Overflow用户

发布于 2020-01-07 18:19:40

更新如果您可以假设蜂窝网络始终是计量的,而WiFi始终是非计量的,则可以使用这些NetworkTypes作为约束。有关更多细节,请参阅注释,因为似乎情况并不总是如此。

原始答案

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

这项新工作将在设备切换到蜂窝(计量)连接时运行:

代码语言:javascript
复制
// Create a Constraints object that defines when the task should run
val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.METERED)
        .build()

WorkManager guide covers WorkRequests with constraints

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59621533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档