【问题标题】:How can I run a Job only when on a Cellular Network using WorkManager?如何仅在蜂窝网络上使用 WorkManager 运行作业?
【发布时间】:2020-01-07 02:44:15
【问题描述】:

我正在开发一个应用程序,它必须在 WiFi 连接丢失时运行作业。我可以使用 WorkManager 轻松检测设备何时获得 WiFi 连接,但我还没有找到一种方法将 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 的方法。我是否遗漏了什么,或者 WorkManagers 目前无法做到这一点?

【问题讨论】:

    标签: android broadcastreceiver android-workmanager android-jobscheduler


    【解决方案1】:

    更新 如果您可以假设蜂窝网络始终按流量计费,而 WiFi 始终不按流量计费,您可以使用这些 NetworkTypes 作为约束。有关更多详细信息,请参阅 cmets,因为似乎并非总是如此。

    原答案

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

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

    // 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.

    【讨论】:

    • 这实际上不起作用,因为蜂窝网络可以不计量,而 WiFi 网络可以计量。这就是为什么在 JobScheduler API 中不推荐使用它的原因。
    • 有趣,我一直认为 Metered ~ Cellular。您可以在 WorkManager 问题跟踪器上打开功能请求,但此时 WorkManager 中没有任何内容可以指定网络传输类型:issuetracker.google.com/issues/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多