【问题标题】:Overlap in the responsibilities of BroadcastReceiver and IntentServiceBroadcastReceiver 和 IntentService 的职责重叠
【发布时间】:2017-02-14 23:28:58
【问题描述】:
BroadcastReceiver 和 IntentService 的职责有重叠对吗?我的意思是,设置一个触发 IntentService 的 BroadcastReceiver 来执行一些需要完成的任务是多余的。由于两者都响应意图,因此仅让 IntentService 直接响应意图而不使用 BroadcastReceiver 作为中介会更简单。
这个解释正确吗?它总是正确的吗?如果不是,请举例说明何时不正确。
非常感谢!
【问题讨论】:
标签:
android
broadcastreceiver
intentservice
android-intentservice
【解决方案1】:
我的意思是,设置一个触发 IntentService 的 BroadcastReceiver 来执行一些需要完成的任务是多余的
这不仅不一定是多余的,而且是一种非常常见的模式。
这个解释正确吗?
没有。
请举例说明什么时候不正确。
Intent 与sendBroadcast() 或startService() 一起使用。如果Intent 与sendBroadcast() 一起使用,则服务无法直接响应它。同样,如果Intent 与startService() 一起使用,则接收者不可能直接响应它。因此,如果其他人编写代码来使用Intent,您必须与他们的使用方式相匹配。您不能单方面“更改使用Intent 的频道”。
除此之外,BroadcastReceiver 的onReceive() 总是在主应用程序线程上调用。您不想在这里花费任何有意义的时间,因为如果您的 UI 恰好在前台,它将冻结您的 UI。而且,一旦onReceive() 返回,清单注册的接收器实例将被丢弃,并且您的进程可能会在此后不久终止。因此,BroadcastReceiver 派生自己的后台线程是不安全的,因为 Android 将忽略该线程并终止您的进程。响应系统发送广播的常见模式是使用BroadcastReceiver,然后让它将工作委托给IntentService。一下子解决了这两个问题:
-
IntentService 在后台线程上调用 onHandleIntent() 进行繁重的工作
- 因为它是一个
Service,所以在执行该工作的同时运行它会向操作系统发出信号,让您的进程存活一段时间
现在,如果您是创建Intent 的人并且您是调度Intent 的人并且您是消费Intent 的人,并且您希望您的代码直接使用startService() 来调用IntentService,非常好。