2

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

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

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

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 Developers 博客上找到了这个,它说明了这一点:


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

显式意图通过 ComponentName 指定他们应该匹配的单个显式“谁”。无论 Intent 中的其他内容如何,​​它只与在其 ComponentName 中给出的确切清单包名称和类名称相关联。


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

4

2 回答 2

4

<intent-filter>当您想使用隐式意图启动接收器时需要它,如果您始终使用显式意图来启动广播接收器,则不需要意图过滤器。

看到这个 SO Post

于 2012-07-18T01:00:43.043 回答
-1

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

请阅读 Intent 的文档并了解 Intent 如何允许 IPC。

更新

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

于 2012-07-18T00:51:47.237 回答