我已经尝试使用AlarmManager和JobScheduler来实现这一点,但不允许我从后台终止该应用程序。
答案 0 :(得分:1)
您可以尝试使用WorkerManager。
1)从gradle中包含它
implementation "androidx.work:work-runtime-ktx:2.2.0"
2)继承抽象类Worker,实现“ doWork”方法并将您的逻辑放入该方法中。
class MyWorker(val ctx : Context, params : WorkerParameters) : Worker(ctx, params)
{
override fun doWork(): Result
{
//put your work here
return Result.success()
}
}
3)例如,在您的ViewModel中创建WorkManager:
private val workManager = WorkManager.getInstance(applicationContext)
4)在后台开始定期工作:
workManager.enqueueUniquePeriodicWork(
"workName",
ExistingPeriodicWorkPolicy.REPLACE,
PeriodicWorkRequest
.Builder(MyWorker::class.java, 30L, TimeUnit.SECONDS)
.build())
有关更多信息,请下载官方示例:
git clone -b codelab_start_kt https://github.com/googlecodelabs/android-workmanager
或遵循以下出色的代码实验室:https://codelabs.developers.google.com/codelabs/android-workmanager-kt/index.html#0
答案 1 :(得分:0)
您应该使用具有定期功能的最新WorkManager库。
添加依赖项,如下所示:
// (Java only)
implementation 'androidx.work:work-runtime:2.2.0'
// Kotlin + coroutines
implementation 'androidx.work:work-runtime-ktx:2.2.0'
然后您可以创建一个定期请求,如下所示:
val constraints = Constraints.Builder()
.setRequiresCharging(true)
.build()
val saveRequest = PeriodicWorkRequestBuilder<SaveImageToFileWorker>(1, TimeUnit.HOURS)
.setConstraints(constraints)
.build()
WorkManager.getInstance(myContext).enqueue(saveRequest)
有关详细信息,请参见documentation
答案 2 :(得分:0)
正如@Niladree所说,您可以使用Jetpack中的 WorkManager 。但是如果作业的确切时间很重要,则必须使用 警报管理器 和 广播接收器 ,因为如果在适当的时间(从内存或CPU开始执行),工作经理会在该时间完成工作,并且在某些情况下可能会导致执行延迟。