来自 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..等。 示例:

  1. BroadcastReceiver 收到 intent
  2. BroadcastReceiver 启动服务,运行工作线程处理长时间任务
  3. 工作线程完成后,也调用完成服务

=========================================

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 启动服务