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

Android 如何仅在使用WorkManager的蜂窝网络上运行作业?,android,broadcastreceiver,android-workmanager,android-jobscheduler,Android,Broadcastreceiver,Android Workmanager,Android Jobscheduler,我正在开发一个应用程序,当WiFi连接丢失时,它必须运行作业。我可以使用WorkManager轻松检测设备何时连接到WiFi,但我还没有找到一种方法将Worker设置为仅在手机数据上运行,我会在检测到用户连接到WiFi网络后立即设置 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACC

我正在开发一个应用程序,当WiFi连接丢失时,它必须运行作业。我可以使用WorkManager轻松检测设备何时连接到WiFi,但我还没有找到一种方法将Worker设置为仅在手机数据上运行,我会在检测到用户连接到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>
我过去的做法是使用广播接收器,当用户连接或断开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使用其中一种,但我希望避免这种情况。我看过WorkManager,但没有找到一种仅在使用蜂窝数据时运行Worker的方法。我是否遗漏了某些内容,或者这在WorkManager中目前不可能实现?

更新如果您可以假设蜂窝网络始终按流量计费,而WiFi始终未按流量计费,则可以使用这些网络类型作为约束条件。更多细节请参见评论,因为情况似乎并非总是如此

原始答案

您可以在有WIFI连接时运行的工作中创建具有约束的新工作请求

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

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

.

这实际上不起作用,因为蜂窝网络可以不计量,而WiFi网络可以计量。这就是为什么它在中被弃用的原因。有趣的是,我一直认为是计量的~Cellular。您可以在WorkManager问题跟踪器上打开功能请求,但此时WorkManager中没有指定网络传输类型的内容: