首页 > 解决方案 > Android在后台停止定期工作管理器

问题描述

当应用程序不起作用时,我正在使用定期工作管理器将本地数据发送到服务器。它在我的Google Pixel上完美运行,但它在Arma小米设备上停止,让我们编写一些代码:

val tag = BackgroundSyncWorker.TAG
val workManager = WorkManager.getInstance(context)

val period = if (BuildConfig.DEBUG) {
    DEBUG_BACKGROUND_WORKER_PERIOD
} else {
    BACKGROUND_WORKER_PERIOD
}

val request = PeriodicWorkRequest.Builder(
    BackgroundSyncWorker::class.java,
    period,
    TimeUnit.MINUTES,
    1,
    TimeUnit.MINUTES
).addTag(tag)
    .build()

workManager.enqueueUniquePeriodicWork(tag, ExistingPeriodicWorkPolicy.KEEP, request)

和常量:

val DEBUG_BACKGROUND_WORKER_PERIOD = 15L
const val BACKGROUND_WORKER_PERIOD = 60L

当应用程序启动时,代码被调用并且应用程序已经关闭,当我们查看工作数据库时,它包含预定的工作: 在此处输入图像描述 在此处输入图像描述

而且我已经等待了大约 40 分钟并且没有发生任何事情(工作人员在启动时收到通知),但是当我启动应用程序时工作人员立即开始工作

标签: androidkotlinandroid-workmanager

解决方案


使用:adb shell dumpsys jobscheduler

检查转储并查看不满意的内容:

Required constraints: TIMING_DELAY CONNECTIVITY [0x90000000]
  Satisfied constraints: DEVICE_NOT_DOZING BACKGROUND_NOT_RESTRICTED WITHIN_QUOTA [0x3400000]
  Unsatisfied constraints: TIMING_DELAY CONNECTIVITY [0x90000000]

还要检查您的存储桶:

备用桶:稀有

如果您在 RARE 存储桶中,您可能会进行电池优化。这意味着每 24 小时执行工作的时间更少。这表示为 QUOTA。但是您也可以检查您使用的时间。转到以下部分:

QuotaController,你会看到你的应用进程 id 是这样的:

#{pdid}/1338805651 from {pdid}
    ACTIVE, within quota, 600000ms remaining in quota

此外,这可能意味着更少的网络连接。表示为 CONNECTIVIY。不幸的是,如果您没有网络或类型不正确 - 您将看到与 Unsatisfied 相同的内容。这有点令人困惑。

还请用户免除您的电池优化:

https://developer.android.com/training/monitoring-device-state/doze-standby#support_for_other_use_cases

还要检查这个网站为什么一切都不可靠:

https://dontkillmyapp.com/

这里还有一些关于如何改进每个供应商的想法。


推荐阅读