显式意向广播接收器 - 操作筛选器行为



我正在尝试使我的应用程序适应新的Android O方法,特别是在意图方面,特别是广播接收器。我有些怀疑我是否正确理解了对服务/广播接收器的新限制。我开始做一些实验。我的目标是 API 级别 27(最低 API 级别 26(,现在我对结果更加困惑。

  1. 创建应用com.example.app

  2. 声明 (AndroidManifest.xml( 一个广播接收器:

<receiver android:name=".BcastReceiver">
<intent-filter>
<action android:name="com.example.app.WAKE_UP" />
</intent-filter>
</receiver>

让我感到困惑的是通过 adb shell 进行意图调用的结果:

A( 匹配操作

am broadcast -n "com.example.app/.BcastReceiver" -a "com.example.app.WAKE_UP">

B( 不匹配操作

am 广播 -n "com.example.app/.BcastReceiver" -a "废话">

C( 缺少动作

am broadcast -n "com.example.app/.BcastReceiver"这些

A(、B( 或 C( 中的任何一个调用实际上会导致应用程序被实例化,广播接收器被调用。

似乎实际上忽略了动作动作意图过滤器。因此,我删除了AndroidManifest.xml中的意图过滤器:

<receiver android:name=".BcastReceiver"/>

但是,通过该声明,A(,B(或C(都无法调用广播接收器。似乎必须存在意图过滤器,但它的内容被忽略了。任何提示为什么会这样?

我今天找到了原因。它与android:exported旗有关。正如官方文档中所述:

默认值取决于广播接收器是否包含 意向筛选器。没有任何过滤器意味着它可以 仅由指定其确切类名的 Intent 对象调用。这 意味着接收器仅用于应用程序内部 使用(因为其他人通常不知道类名(。所以在这个 在这种情况下,默认值为"假"。另一方面,存在 至少一个滤波器意味着广播接收器旨在 接收由系统或其他应用程序广播的意图,因此 默认值为"true"。

如果缺少 Intent 筛选器,则不会导出广播接收器,因此无法从应用外部调用。如果存在意图过滤器,则默认情况下会导出广播接收器。它适用于服务和广播接收器 - 额外的限制是后台应用程序的后台服务不会启动。

然而,忽略的操作仍然存在不一致,但我个人的理解是,如果 startservice/广播是显式的 - 显式/唯一地命名目标组件 - 没有理由考虑操作意图过滤器。

最新更新