我已经能够让我的 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>
吗?我将它与特定的课程相匹配。可能没有一个实际的动作将它们绑在一起,珀斯,但是这个类就足够了吗?