Начиная с Android 6.0 (уровень API 23), Android представил Doze Mode и ввел различные ограничения на фоновую обработку в Android.Android также представил WorkManager API, который позволяет легко определять асинхронные задачи и когда они должны выполняться.Из документации Android WorkManager мы получаем:
Примечание: WorkManager предназначен для задач, требующих гарантии , что система будет их запускать, даже еслиприложение закрывается.
Я проверил то же самое с помощью следующей программы:
В MainActivity (Активность запуска приложения) я создаю PeriodicWorkRequest с периодическим интервалом 15 минут (минимально допустимый интервалдля периодического запроса) и обработайте его для workManager
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runWorkRequest()
}
// create a PeriodicWorkRequest with Periodic Interval of 15 mins
fun runWorkRequest() {
val periodicWorkRequestBuilder = PeriodicWorkRequest.Builder(BatteryWorker::class.java, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS
, TimeUnit.MILLISECONDS)
val periodicWorkRequest = periodicWorkRequestBuilder.build()
WorkManager.getInstance().enqueue(periodicWorkRequest)
}
}
, а BackgroundWorker будет следующим образом и регистрирует каждый раз, когда он выполняется:
public class BackgroundWorker extends Worker {
@NonNull
@Override
public Result doWork() {
Log.d("MyBackgroundWorker", "BackgroundWorker is Running");
return Result.SUCCESS;
}
}
Теперь, если я запускаю приведенный выше код на уровне API 28и, удалив приложение из списка недавних приложений и выключив экран устройства, журналы печатаются периодически всего в течение 40-45 минут, а затем фоновый рабочий останавливается.Это противоречит гарантированному выполнению, о котором говорится в документации.
У кого-нибудь есть решение для гарантированного неопределенного периодического выполнения (с периодическим интервалом 15 минут) в фоновом режиме в Android Oreo и выше?