Android 显式意图广播接收器-动作筛选器行为
我正在尝试使我的应用程序适应新的安卓O方法,特别是广播接收器。我怀疑自己是否正确理解对服务/广播接收器施加的新限制。我开始做一些实验。我的目标是API级别27(最低API级别26),现在我对结果更加困惑Android 显式意图广播接收器-动作筛选器行为,android,Android,我正在尝试使我的应用程序适应新的安卓O方法,特别是广播接收器。我怀疑自己是否正确理解对服务/广播接收器施加的新限制。我开始做一些实验。我的目标是API级别27(最低API级别26),现在我对结果更加困惑 创建appcom.example.app 声明(AndroidManifest.xml)广播接收器: 让我困惑的是通过adb shell调用意图的结果: A) 匹配动作 am broadcast -n "com.example.app/.BcastReceiver" -a "com.exam
让我困惑的是通过adb shell调用意图的结果:
A) 匹配动作
am broadcast -n "com.example.app/.BcastReceiver" -a "com.example.app.WAKE_UP"
am broadcast -n "com.example.app/.BcastReceiver" -a "nonsense"
am broadcast -n "com.example.app/.BcastReceiver"
am广播-n“com.example.app/.BcastReceiver”-a“com.example.app.WAKE\u”
B) 非匹配动作
am broadcast -n "com.example.app/.BcastReceiver" -a "com.example.app.WAKE_UP"
am broadcast -n "com.example.app/.BcastReceiver" -a "nonsense"
am broadcast -n "com.example.app/.BcastReceiver"
am广播-n“com.example.app/.BcastReceiver”-一个“胡说八道”
C) 遗漏动作
am broadcast -n "com.example.app/.BcastReceiver" -a "com.example.app.WAKE_UP"
am broadcast -n "com.example.app/.BcastReceiver" -a "nonsense"
am broadcast -n "com.example.app/.BcastReceiver"
am广播-n“com.example.app/.BcastReceiver”
这些A)、B)或C)调用中的任何一个实际上都会导致应用程序被实例化,广播接收器被调用
看起来动作意图过滤器实际上被忽略了。因此,我删除了AndroidManifest.xml中的意图过滤器:
但有了这个声明,A)、B)或C)都无法调用广播接收器。看来意图过滤器必须存在,但其内容被忽略。有什么提示吗?我今天找到了原因。它与
android:exported
标志相关。正如合同中所述:
默认值取决于广播接收器是否包含
意图过滤器。没有任何过滤器意味着它可以
仅由指定其确切类名的意图对象调用。这
意味着接收器仅用于内部应用
使用(因为其他人通常不知道类名)。所以在这个
在这种情况下,默认值为“false”。另一方面,存在
至少一个滤波器意味着广播接收机打算
接收系统或其他应用程序广播的意图,因此
默认值为“true”
如果缺少意图过滤器,则不会导出广播接收器,因此无法从应用程序外部调用。如果存在意图过滤器,则默认情况下导出广播接收器它既适用于服务,也适用于广播接收器-这样,后台应用程序的后台服务将不会启动。
但仍然存在与被忽略的动作的不一致性,但我个人理解,如果StestService /广播是显式的——明确地/唯一地命名目标组件——没有理由考虑动作意图过滤器。