Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 显式意图广播接收器-动作筛选器行为_Android - Fatal编程技术网

Android 显式意图广播接收器-动作筛选器行为

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

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

  • 创建appcom.example.app

  • 声明(AndroidManifest.xml)广播接收器:

  • 
    
    让我困惑的是通过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 /广播是显式的——明确地/唯一地命名目标组件——没有理由考虑动作意图过滤器。