重叠BroadcastReceiver和IntentService

时间:2017-02-14 23:28:59

标签: android broadcastreceiver intentservice android-intentservice

BroadcastReceiver和IntentService的职责有些重叠是否正确?通过这种方式,我的意思是设置一个触发IntentService的BroadcastReceiver是多余的,该IntentService执行一些需要完成的任务。由于两者都响应意图,因此只需IntentService直接响应意图而不使用BroadcastReceiver作为中介即可。

这种解释是否正确?总是正确的吗?如果没有,请举例说明它何时不正确。

非常感谢!

1 个答案:

答案 0 :(得分:1)

  

我的意思是设置一个触发IntentService的BroadcastReceiver是多余的,这个IntentService执行一些需要完成的任务

这不仅是多余的,而且是一种非常常见的模式。

  

这种解释是否正确?

没有

  

请举例说明何时不正确。

IntentsendBroadcast()startService()一起使用。如果IntentsendBroadcast()一起使用,则服务无法直接对其进行响应。同样,如果IntentstartService()一起使用,则接收方无法直接对其进行响应。因此,在其他人编写代码以使用Intent的情况下,您必须与他们使用它的方式相匹配。您无法单方面“更改Intent使用的频道”。

除此之外,总是在主应用程序线程上调用onReceive()的{​​{1}}。您不希望在此处花费任何有意义的时间,因为如果您的UI恰好位于前台,它将冻结您的UI。并且,一旦BroadcastReceiver返回,清单注册的接收者的实例将被丢弃,您的过程可能在此后不久终止。因此,onReceive()分叉自己的后台线程是不安全的,因为Android将忽略该线程并终止您的进程。响应系统发送的广播的常见模式是使用BroadcastReceiver,然后让它将工作委托给BroadcastReceiver。一下子,你解决了这两个问题:

  • IntentServiceIntentService中进行了繁重的工作,在后台线程中调用
  • 因为它是一个onHandleIntent(),让它在运行时会向操作系统发出信号让你的进程再活一段时间

现在,如果您是创建Service的人,那么您就是那个Intent并且您正在使用Intent的人,并且您希望使用您的代码Intent直接调用startService(),完全没问题。