API 26(Android 8.0 Oreo)不推荐使用IntentService + WakefulBroadcastReceiver + AlarmManager。哪个是最好的选择?

时间:2017-10-09 16:04:40

标签: android deprecated intentservice android-8.0-oreo

有时在我的应用中,我需要在背景中反复做一些事情(每隔X小时)。

最多API 25我使用:

  • AlarmManager使用setInexactRepeating(尊重电池)
  • WakefulBroadcastReceiver有足够的时间来完成所有工作
  • IntentService在后​​台线程中执行所有操作

在API 26上,所有这些都已弃用或受限制,建议使用JobScheduler代替JobService

问题是JobService在主线程中运行。

我想在AsyncTask内使用JobService并在JobService.jobFinished内调用onPostExecute

这是正确的方法吗?

2 个答案:

答案 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)

  

在API 26上,所有这些都已弃用或限制

在Android 8.0,IIRC中,

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()开展工作。