【问题标题】: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 来执行一些需要完成的任务是多余的

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

    这个解释正确吗?

    没有。

    请举例说明什么时候不正确。

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

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

    • IntentService 在后台线程上调用 onHandleIntent() 进行繁重的工作
    • 因为它是一个 Service,所以在执行该工作的同时运行它会向操作系统发出信号,让您的进程存活一段时间

    现在,如果您是创建Intent 的人并且您是调度Intent 的人并且您是消费Intent 的人,并且您希望您的代码直接使用startService() 来调用IntentService,非常好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2018-01-31
      • 2011-03-17
      相关资源
      最近更新 更多