我正在尝试设置一个 JobScheduler 来运行 JobService 以在某些条件下下载文件。
它的工作就像一个魅力,但我无法让它在 VPN 下工作。
我尝试过更改功能,但没有效果。 我尝试了多个 VPN,但都没有用。
这是我启动 JobService 的用例的代码。
/**
* A use case for downloading a replay.
*
* This use case schedules a download job using the `JobScheduler`.
* The download job is handled by the `DownloadJobService`.
*
*/
class DownloadReplayUseCase @Inject constructor(
@ApplicationContext private val context: Context,
private val moshi: Moshi,
) : (Replay) -> Unit {
companion object {
private const val DOWNLOAD_JOB_ID_START = 10001
private const val DOWNLOAD_JOB_ID_END = 20000
private var currentJobId = DOWNLOAD_JOB_ID_START
private const val MAXIMUM_SCHEDULING_LATENCY = 1000L
}
/**
* Schedules a download job for the given replay.
*
* @param replay The replay to download.
*/
override fun invoke(replay: Replay) {
val networkRequest = NetworkRequest.Builder()
.addCapability(NET_CAPABILITY_INTERNET)
.addCapability(NET_CAPABILITY_VALIDATED)
.addCapability(NET_CAPABILITY_NOT_VPN)
.build()
val bundle = PersistableBundle().apply {
putString(DownloadJobService.REPLAY_JSON_KEY, ReplayJsonAdapter(moshi).toJson(replay))
}
val jobId = currentJobId++
if (jobId > DOWNLOAD_JOB_ID_END) {
currentJobId = DOWNLOAD_JOB_ID_START
}
val jobInfoBuilder = JobInfo.Builder(
jobId, ComponentName(context, DownloadJobService::class.java),
).setExtras(bundle)
val jobInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
jobInfoBuilder
.setRequiredNetwork(networkRequest)
.setUserInitiated(true)
.build()
} else {
jobInfoBuilder
.setOverrideDeadline(MAXIMUM_SCHEDULING_LATENCY)
.build()
}
val jobScheduler: JobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(jobInfo)
}
}
在基本网络上时,一切都按预期工作,并且我的 DownloadJobService 立即启动。
但是,当我使用 VPN 时,什么也没有发生。它一直在排队,直到我停止 VPN。
欢迎任何帮助!
在您的代码中,您有
.addCapability(NET_CAPABILITY_NOT_VPN)
。当与 JobInfo.Builder
一起使用时,这表示“仅当我们的网络不在 VPN 上时运行作业”。您报告说该作业仅在您不在 VPN 上时运行。因此,看起来代码就像文档一样工作。
该文档指出:
表示该网络不是 VPN。此功能是默认设置的,应针对 VPN 网络明确清除。
这表明您应该尝试
.removeCapability(NET_CAPABILITY_NOT_VPN)
。