【问题标题】:Android: Implicit Intents vs. Broadcast ReceiversAndroid:隐式意图与广播接收器
【发布时间】:2014-03-17 01:18:13
【问题描述】:

我正在加快 Android 开发的速度,隐式意图和广播接收器之间的区别尚不清楚。我希望在区分这些概念以及何时使用这两个概念方面得到帮助。

两者都接收意图,都对系统消息做出反应,那么为什么甚至需要广播接收器以及何时使用它而不是隐式意图和意图过滤器来接受隐式意图?

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    广播就是这样——向任何收听的人广播消息。它们本质上是不安全的,并且无法保证交付给预期的收件人,因为确实没有预期的收件人。例如,CONNECTIVITY_CHANGE 广播清楚地表明了这一点:当 Android 设备中的连接发生变化时,许多应用程序可能会感兴趣。而不是ConnectivityManager 必须通过特定的Intent 通知每个应用程序,它发送一个广播。任何对此事件感兴趣的应用都会收到通知。任何未运行或不在乎的应用程序......不会。

    当一个应用程序或Activity 想要启动另一个应用程序以执行非常具体的操作时,“发送”Intent。例如,文件管理器可能想要启动图像查看器或视频播放器。您的应用程序可能希望在您的另一个应用程序中启动一个非常具体的Activity,等等。通过特定意图(即包括包名称和组件名称)的通信不容易被拦截,因此它更安全一些。最重要的是,只有一个“接收者”——如果找不到,Intent 将失败。

    此外,BroacastReceiver 将在 ActivityService 中处于活动状态,并且接收到的广播通常只会更改状态和/或进行较小的 UI 更新...例如,如果您的互联网连接断开。相比之下,一个特定的 Intent 通常会启动一个新的Activity 或将一个现有的 Intent 带到前台。

    【讨论】:

    • 操作系统向任何收听的人发送的隐式意图怎么样。在我看来,这些意图类型与广播接收器有很多重叠。
    • 隐式意图不会发送给我的操作系统,而是由操作系统解决。例如,如果一个应用想要查看一个图像,任何注册来处理图像数据和VIEW 操作的应用都可以接收到这个意图。然后操作系统将为此使用“默认”应用程序,或者,如果没有,则在将意图传递给 one 应用程序之前提示用户。一个 Intent 仍然只有 一个 接收者,而广播可能有零个或多个接收者。
    • @user3426948 我认为你在比较两个非常不同的东西,没有重叠。意图是消息传递对象,广播接收器是应用程序组件。 Intent 用于从某个应用程序组件请求某些操作,它可以是广播接收器、活动或服务。操作系统解决的那些隐含意图,如@ 323go 所说的,通常是为了广播接收器,也许它在那里你感到困惑?
    【解决方案2】:

    我将在此处列出Implicit Intents(通过startActivity()发送)和Broadcasts(通过sendBroadcast()发送)之间的所有区别

    1. 默认情况下,广播可以同时影响多个应用程序(有序广播有可能被中断)。相反,隐式意图只会影响一个应用程序。 请注意,可能有多种应用可能会受到影响,但最终只有一种会受到影响。
    2. 隐式 Intent 是通过 Intent-Filters 处理的,而广播是通过 Broadcast Receivers 处理的(尽管 Intent-Filters 在这里也起作用)。 我在网络上看到很多情况下将广播与意图过滤器进行比较,这对我来说没有意义。
    3. 隐式 Intent 启动 Activity 或服务。相比之下,广播会启动广播接收器。 (如果你想一想,这就是 Intent 和 Broadcasts 之间的核心区别。正是因为这个原因,Broadcasts 并不意味着做太多繁重的工作,尤其是 UI 工作!)
    4. 来自the Developers Website

    BroadcastReceiver 无法查看或捕获使用的 Intent 与 startActivity();同样,当你广播一个 Intent 时,你会 永远找不到或启动活动。这两个操作在语义上 非常不同:使用 Intent 启动 Activity 是前景 修改用户当前正在与之交互的内容的操作; 广播 Intent 是用户不参与的后台操作 通常知道。

    如果我发现其他内容,我会添加更多。

    【讨论】:

    • 这应该是公认的答案。一个精心编制的列表,可以更好地解释差异。
    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多