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 我使用:
AlarmManager
setInexactRepeating(尊重电池)
WakefulBroadcastReceiver
有足够的时间完成所有工作
IntentService
在后台线程中完成所有工作
在 API 26 上,所有这些都已弃用或受到限制,建议使用 JobScheduler
和 JobService
代替。
问题是 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
有时在我的应用程序中,我需要在后台重复执行某些操作(每隔 X 小时)。
最多 API 25 我使用:
AlarmManager
setInexactRepeating(尊重电池)WakefulBroadcastReceiver
有足够的时间完成所有工作IntentService
在后台线程中完成所有工作
在 API 26 上,所有这些都已弃用或受到限制,建议使用 JobScheduler
和 JobService
代替。
问题是 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