来自 BroadcastReceiver 的长 运行 后台任务 - 使用哪个 class?
Long running background task from BroadcastReceiver - which class to use?
既然 AsyncTask, IntentSerrvice and JobIntentService 都被弃用了,我应该在 2022 年使用哪个工具或 class?
我想在设备重新启动后重新安排 BroadcastReceiver
中的警报(因为在此过程中警报会丢失)。该任务很可能需要 < 1 分钟才能完成。我只需要它完成而不被系统杀死的安全性。
关于广播的文档显示了(过时的)example with goAsync() 和已弃用的 AsyncTask
。
但它也提到了JobService
。那是替补吗? WorkManager
呢?
goAsync() return PendingIntent - 这意味着您要求 android 系统延长广播接收器的使用寿命 => goAsync() 用于短后台任务。
BroadcastReceiver 的生命周期很短,所以......对于长时间的后台任务,你必须换成其他生命周期更长的上下文,例如:Service,JobService..等。
示例:
- BroadcastReceiver 收到 intent
- BroadcastReceiver 启动服务,运行工作线程处理长时间任务
- 工作线程完成后,也调用完成服务
=========================================
class MyIntentService : Service() {
private val handleThread = HandlerThread("MyThread")
private lateinit var workerHandler: Handler
override fun onCreate() {
super.onCreate()
handleThread.start()
workerHandler = Handler(handleThread.looper)
}
override fun onDestroy() {
workerHandler.removeCallbacksAndMessages(null)
handleThread.quitSafely()
super.onDestroy()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val data = intent?.data
workerTask(data)
return START_NOT_STICKY
}
private fun workerTask(data: Uri?) {
workerHandler.post {
heavyTask(data)
finishMyIntentService()
}
}
private fun finishMyIntentService() {
stopSelf()
}
private fun heavyTask(data: Uri?) {
// to do heavyTask example
for (i in 1..20)
{
Log.d("test","#heavyTask() $i")
Thread.sleep(1000)
}
}
override fun onBind(intent: Intent?): IBinder? {
TODO("Not yet implemented")
}
}
然后从 BroadCastReceiver 启动服务
既然 AsyncTask, IntentSerrvice and JobIntentService 都被弃用了,我应该在 2022 年使用哪个工具或 class?
我想在设备重新启动后重新安排 BroadcastReceiver
中的警报(因为在此过程中警报会丢失)。该任务很可能需要 < 1 分钟才能完成。我只需要它完成而不被系统杀死的安全性。
关于广播的文档显示了(过时的)example with goAsync() 和已弃用的 AsyncTask
。
但它也提到了JobService
。那是替补吗? WorkManager
呢?
goAsync() return PendingIntent - 这意味着您要求 android 系统延长广播接收器的使用寿命 => goAsync() 用于短后台任务。 BroadcastReceiver 的生命周期很短,所以......对于长时间的后台任务,你必须换成其他生命周期更长的上下文,例如:Service,JobService..等。 示例:
- BroadcastReceiver 收到 intent
- BroadcastReceiver 启动服务,运行工作线程处理长时间任务
- 工作线程完成后,也调用完成服务
=========================================
class MyIntentService : Service() {
private val handleThread = HandlerThread("MyThread")
private lateinit var workerHandler: Handler
override fun onCreate() {
super.onCreate()
handleThread.start()
workerHandler = Handler(handleThread.looper)
}
override fun onDestroy() {
workerHandler.removeCallbacksAndMessages(null)
handleThread.quitSafely()
super.onDestroy()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val data = intent?.data
workerTask(data)
return START_NOT_STICKY
}
private fun workerTask(data: Uri?) {
workerHandler.post {
heavyTask(data)
finishMyIntentService()
}
}
private fun finishMyIntentService() {
stopSelf()
}
private fun heavyTask(data: Uri?) {
// to do heavyTask example
for (i in 1..20)
{
Log.d("test","#heavyTask() $i")
Thread.sleep(1000)
}
}
override fun onBind(intent: Intent?): IBinder? {
TODO("Not yet implemented")
}
}
然后从 BroadCastReceiver 启动服务