从Honeycomb(API 11)开始,Android有一项功能,允许broadcastReceiver以异步方式运行,在它假定它可以终止其进程之前大约10秒,使用名为" {{3的方法}}" :
这可以由onReceive(Context,Intent)中的应用程序调用 允许它在返回后保持广播活动 功能。这并没有改变相对的期望 响应广播(在10秒内完成),但确实允许 将与之相关的工作移动到另一个线程的实现 避免因磁盘IO而导致主UI线程出现故障。
我在很多地方搜索过,并没有找到任何有关如何使用它的示例或教程。
不仅如此,该方法返回一个PendingIntent实例,我不确定如何处理它:
返回表示结果的BroadcastReceiver.PendingResult 主动广播。 BroadcastRecord本身不再有效; 所有数据和其他互动必须经过 BroadcastReceiver.PendingResult API。 PendingResult.finish() 一旦完成广播处理,就必须调用该方法。
你如何使用这种方法?
它返回的PendingIntent是什么,我该怎么办呢?
答案 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
}
}