IntentService + WakefulBroadcastReceiver + AlarmManager 已弃用 API 26 (Android 8.0 Oreo)。哪个是最好的选择?

IntentService + WakefulBroadcastReceiver + AlarmManager are deprecated with API 26 (Android 8.0 Oreo). Which is the best alternative?

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

最多 API 25 我使用:

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

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

我想在 JobService 中使用 AsyncTask 并在 onPostExecute

中调用 JobService.jobFinished

这是正确的方法吗?

On API 26 all of this are deprecated or limited

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

The problem is that JobIntentService run in main thread.

onHandleWork() 在后台线程上调用,适用于 Android 8.0+ 和 pre-8.0 设备。我使用 this sample app of mine,添加日志语句来记录 enqueueWork()(在主应用程序线程上调用)和 onHandleWork() 中的当前线程 ID。它们是不同的线程 ID,因此它们是不同的线程。

this is the correct way to do this?

不,只是在 onHandleWork() 完成工作。

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

更多, https://developer.android.com/reference/android/support/v4/app/JobIntentService.html