【问题标题】:Does a Android BroadcastReceiver need to have an Intent-Filter tag?Android BroadcastReceiver 是否需要有 Intent-Filter 标签?
【发布时间】:2012-07-18 00:35:37
【问题描述】:

我已经能够让我的 BroadcastReceiver 运行这个:

<receiver
        android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="false">
</receiver>

如您所见,没有&lt;intent-filter&gt;。使用正确的Intent extras 可以正确调用它。但我一直在环顾四周,我很困惑我是否需要一个?我确实有一个在我的Intents 上调用的setAction() 方法,但要使它们与其他方法不同,以确保通知的特定问题,而不是实际使用该操作的字符串。但究竟是什么相关性?提前致谢。

Intent intent = new Intent(this.getContext(), AlarmReceiver.class);
        intent.setAction("com.something"+System.currentTimeMillis());
        //... extras are here
        PendingIntent pi = PendingIntent.getBroadcast(this.getContext(), 123, intent, PendingIntent.FLAG_CANCEL_CURRENT|Intent.FILL_IN_DATA);
AlarmManager alarm = (AlarmManager)getContext().getSystemService(Activity.ALARM_SERVICE);
        alarm.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pi);

将它与我在清单文件中的内容一起使用。

编辑 我在 Android 开发者博客上找到了这个,它说:


Implicit Intents 仅指定它们应该匹配的“什么”,使用操作、类别、数据、 MIME 类型等等。他们将找到的确切组件仅在 运行时,由包管理器将其与当前应用程序匹配。

Explicit Intents 指定一个明确的“谁”他们应该匹配,通过 组件名称。无论 Intent 中还有什么其他内容,它只与 在其 ComponentName 中给出的确切清单包名称和类名称。


我仍然对这个解释有些困惑,但这似乎是最接近我应该做的事情。所以我确定我使用的是隐含的意图。问题是,我可以忽略&lt;intent-filter&gt; 吗?我将它与特定的课程相匹配。可能没有实际的动作将它们联系在一起,珀斯,但是这个类就足够了吗?

【问题讨论】:

    标签: android broadcastreceiver intentfilter


    【解决方案1】:

    &lt;intent-filter&gt; 当您想使用隐式意图启动接收器时需要,如果您总是使用显式意图来启动广播接收器,则不需要意图过滤器。

    this SO Post

    【讨论】:

    • 非常感谢您提供的链接。我很了解这里的那个人,所以我会直接问他。
    【解决方案2】:

    广播接收器的整个工作方式是使用 Intent Filter 来捕获在系统内发送的特定广播意图。因此,如果您不给接收者任何意图过滤器,那么 NOTHING 将被发送给它,并且它的代码将永远不会执行。

    请阅读 Intent 的文档,了解 Intent 是如何实现 IPC 的。

    更新

    也有可能在没有任何声明的情况下,它可以接收所有公共广播以及您的代码处理它的方式。它是否会忽略所有广播,除了它关心的广播。我从来没有做过这种实现,因为我遵循标准。即声明为动态侦听器(程序化)或静态侦听器(XML 声明),其中动态侦听器将在代码中设置其 Intent Filter。

    【讨论】:

    • 这真的很奇怪,因为我的工作正常。就像我说的那样,我的BroadcastReceiver 正确地获得了所有意图附加功能。但我的清单文件中有上述内容。 Sooo,我通常会接受更有经验的人的话,但在这种情况下,这似乎不是真的。任何想法为什么?
    • 你应该按照谷歌设定的标准,这就是我所说的,如果你看他们的源代码,这个想法被多次使用。真的不需要质疑,它就是..是IPC。
    • 也有可能在没有任何声明的情况下,它可能会接收所有公共广播以及您的代码处理它的方式。它是否会忽略所有广播,除了它关心的广播。这导致该代码执行的次数超出了它的需要。
    • 嗯,这很有趣,我非常感谢您的建议。我确实有一个问题。我需要以这种特定方式设置setAction(),如果没有,那么设置通知会出现问题。这意味着动作必须是唯一的......
    • 您需要使用您的具体问题详细信息更新您的帖子。
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多