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

Xan*_*Xan 7 android deprecated intentservice android-8.0-oreo

有时在我的应用程序中,我需要在后台重复执行某些操作(每X小时).

最高API 25我使用:

  • AlarmManager 使用setInexactRepeating(尊重电池)
  • WakefulBroadcastReceiver 有足够的时间做所有的工作
  • IntentService 在后台线程中做所有事情

在API 26所有这一切都被弃用或限制,并建议使用JobSchedulerJobService代替.

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

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

这是正确的方法吗?

Com*_*are 5

在 API 26 上,所有这些都被弃用或受限

AlarmManager在 Android 8.0、IIRC 中没有改变。IntentService在 Android 8.0 中也没有改变。但是,您需要将其IntentService设为前台服务并使用getForegroundService() PendingIntent.

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

onHandleWork()在后台线程上调用,适用于 Android 8.0+ 和 8.0 之前的设备。我使用了我的这个示例应用程序,添加了日志语句来记录当前线程 ID enqueueWork()(在主应用程序线程上调用)和onHandleWork(). 它们是不同的线程 ID,因此它们是不同的线程。

这是正确的方法吗?

不,只需在onHandleWork().


小智 5

您可以使用支持库26的JobIntentService,该库具有IntentService的确切工作流程。对于Oreo之前的设备,JobIntentService将使用旧的IntentService。JobIntentService类依赖于Android的JobScheduler API。

有关更多信息, 请https://developer.android.com/reference/android/support/v4/app/JobIntentService.html