如何为broadcastReceiver使用“goAsync”?

时间:2014-03-30 06:56:07

标签: android asynchronous broadcastreceiver android-pendingintent

背景

从Honeycomb(API 11)开始,Android有一项功能,允许broadcastReceiver以异步方式运行,在它假定它可以终止其进程之前大约10秒,使用名为" {{3的方法}}" :

  

这可以由onReceive(Context,Intent)中的应用程序调用   允许它在返回后保持广播活动   功能。这并没有改变相对的期望   响应广播(在10秒内完成),但确实允许   将与之相关的工作移动到另一个线程的实现   避免因磁盘IO而导致主UI线程出现故障。

问题

我在很多地方搜索过,并没有找到任何有关如何使用它的示例或教程。

不仅如此,该方法返回一个PendingIntent实例,我不确定如何处理它:

  

返回表示结果的BroadcastReceiver.PendingResult   主动广播。 BroadcastRecord本身不再有效;   所有数据和其他互动必须经过   BroadcastReceiver.PendingResult API。 PendingResult.finish()   一旦完成广播处理,就必须调用该方法。

问题

你如何使用这种方法?

它返回的PendingIntent是什么,我该怎么办呢?

2 个答案:

答案 0 :(得分:34)

您可以找到简短的解释here

如果要将goAsync()的{​​{1}}方法内的处理移交给另一个线程,请使用BroadcastReceiver。然后可以在那里完成onReceive()方法。 PendingResult被传递给新线程,您必须调用onReceive()来实际通知系统该接收器可以被回收。

例如:

PendingResult.finish()

答案 1 :(得分:1)

kotlin 中,您可以在 BroadcastReceiver 上编写扩展功能:

/**
 * Run work asynchronously from a [BroadcastReceiver].
 */
fun BroadcastReceiver.goAsync(
    coroutineScope: CoroutineScope,
    dispatcher: CoroutineDispatcher,
    block: suspend () -> Unit
) {
    val pendingResult = goAsync()
    coroutineScope.launch(dispatcher) {
        block()
        pendingResult.finish()
    }
}

之后,您可以在广播接收器中执行以下操作:

class AlarmBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        // Code here runs on the main thread

        goAsync(GlobalScope, Dispatchers.Default) {
            // The code here will run on the background by the default dispatcher on the global scope
            // If your code here touches the IO, then you can use Dispatchers.IO instead
        }
    }