BroadcastReceiver和IntentService的职责有些重叠是否正确?通过这种方式,我的意思是设置一个触发IntentService的BroadcastReceiver是多余的,该IntentService执行一些需要完成的任务。由于两者都响应意图,因此只需IntentService直接响应意图而不使用BroadcastReceiver作为中介即可。
这种解释是否正确?总是正确的吗?如果没有,请举例说明它何时不正确。
非常感谢!
答案 0 :(得分:1)
我的意思是设置一个触发IntentService的BroadcastReceiver是多余的,这个IntentService执行一些需要完成的任务
这不仅是多余的,而且是一种非常常见的模式。
这种解释是否正确?
没有
请举例说明何时不正确。
Intent
与sendBroadcast()
或startService()
一起使用。如果Intent
与sendBroadcast()
一起使用,则服务无法直接对其进行响应。同样,如果Intent
与startService()
一起使用,则接收方无法直接对其进行响应。因此,在其他人编写代码以使用Intent
的情况下,您必须与他们使用它的方式相匹配。您无法单方面“更改Intent
使用的频道”。
除此之外,总是在主应用程序线程上调用onReceive()
的{{1}}。您不希望在此处花费任何有意义的时间,因为如果您的UI恰好位于前台,它将冻结您的UI。并且,一旦BroadcastReceiver
返回,清单注册的接收者的实例将被丢弃,您的过程可能在此后不久终止。因此,onReceive()
分叉自己的后台线程是不安全的,因为Android将忽略该线程并终止您的进程。响应系统发送的广播的常见模式是使用BroadcastReceiver
,然后让它将工作委托给BroadcastReceiver
。一下子,你解决了这两个问题:
IntentService
在IntentService
中进行了繁重的工作,在后台线程中调用onHandleIntent()
,让它在运行时会向操作系统发出信号让你的进程再活一段时间现在,如果您是创建Service
的人,那么您就是那个Intent
并且您正在使用Intent
的人,并且您希望使用您的代码Intent
直接调用startService()
,完全没问题。