没有意图过滤器的Android广播接收器

16

我在 AndroidManifest.xml 中遇到了类似以下的内容:

<receiver android:name="com.testco.test.TestReceiver"/>
以上是TestReceiver扩展了BroadcastReceiver类。我以为接收器会接收所有意图,但显然它并不会,除非我在其中添加intent-filter标签。那么如果没有intent-filter,它会做什么?这是一个错别字还是它确实会执行某些操作?
更新:我通过此链接找到了答案Trying to have a Broadcast Receiver with No filter 而不是使用常规字符串标识符调用广播,您可以将操作字符串设置为意图,然后广播它。参考示例代码:
Intent notifyIntent = new Intent(getApplicationContext(), TestReceiver.class);
notifyIntent.setAction("RECEIVE");
sendBroadcast(notifyIntent);

在 BroadcastReceiver 中的处理方式是相同的。


谁写的那段代码,请告诉他们,他们的操作风格不符合标准。它应该遵循 com.packagename.intent.messagehere 的格式,这是制定的标准,因此应该遵循。 - JoxTraex
4个回答

8
如果是隐式意图,那么就需要使用Intent过滤器。如果没有指定Intent过滤器,则必须显式地调用它。因此,要调用此接收器,您需要调用: ```java Intent intent = new Intent(); intent.setAction("your_action"); context.sendBroadcast(intent); ```
Intent intent = new Intent(getApplicationContext(), com.testco.test.TestReceiver.class);
sendBroadcast(intent);`

嘿,Alex,好久不见了。我有一个关于你的答案的问题。当你说隐式时,这是否意味着可能有多个不同的操作要执行? - Andy
隐式意图是指我们没有明确指定目标组件的意图,目标组件是通过意图过滤器由系统决定的。 - jeet

2
根据文档
android:exported:广播接收器是否可以接收来自应用程序之外的消息,如果可以则为“true”,否则为“false”。如果为“false”,则广播接收器只能接收由同一应用程序或具有相同用户ID的应用程序发送的消息。
默认值取决于广播接收器是否包含意图过滤器。没有任何过滤器意味着它只能被指定了其精确类名的Intent对象调用。这意味着接收器仅用于应用程序内部使用(因为其他人通常不知道类名)。因此,在这种情况下,默认值为“false”。另一方面,至少有一个过滤器的存在意味着广播接收器旨在接收系统或其他应用程序广播的意图,因此默认值为“true”。
因此,接收器只会捕获您的应用程序广播的意图。

0

<receiver android:name="com.testco.test.TestReceiver"/> 标签将告诉安卓操作系统我是一个接收器,仅此而已。它不会告诉你它是用于监听哪个事件的。你的意图过滤器会定义,你要监听哪个事件。例如:

<receiver android:name="com.testco.test.TestReceiver"/>
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

这段代码告诉 Android 操作系统,我是一个接收器并正在监听启动事件。因此,当用户重新启动他的手机时,该广播接收器将被调用。


0

您需要注册接收器并指定要接收的意图,如果想接收所有意图,则需特别声明。

API中明确介绍了Intent和Intent Filter的功能。并非所有意图概念都得到公共API的支持。

注意:您仍然可以通过在应用程序内发送广播来使用此类型的接收器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接