有时在我的应用中,我需要在背景中反复做一些事情(每隔X小时)。
最多API 25我使用:
AlarmManager
使用setInexactRepeating(尊重电池)WakefulBroadcastReceiver
有足够的时间来完成所有工作IntentService
在后台线程中执行所有操作在API 26上,所有这些都已弃用或受限制,建议使用JobScheduler
代替JobService
。
问题是JobService
在主线程中运行。
我想在AsyncTask
内使用JobService
并在JobService.jobFinished
内调用onPostExecute
这是正确的方法吗?
答案 0 :(得分:4)
您可以使用支持库26的JobIntentService,它具有IntentService的确切工作流程。对于pre Oreo设备,JobIntentService将使用旧的IntentService。 JobIntentService类依赖于android的JobScheduler API。
更多信息, https://developer.android.com/reference/android/support/v4/app/JobIntentService.html
答案 1 :(得分:3)
在Android 8.0,IIRC中,在API 26上,所有这些都已弃用或限制
AlarmManager
没有改变。 IntentService
在Android 8.0中也没有变化。但是,您需要将IntentService
设为前台服务并使用getForegroundService()
PendingIntent
。
问题是JobIntentService在主线程中运行。
onHandleWork()
在后台线程上调用,适用于Android 8.0+和8.0之前的设备。我使用this sample app of mine,添加日志语句来记录enqueueWork()
(在主应用程序线程上调用)和onHandleWork()
内的当前线程ID。它们是不同的线程ID,因此它们是不同的线程。
这是正确的方法吗?
不,只需在onHandleWork()
开展工作。