【问题标题】:Is it normal to receive system broadcasts when exported=false?export=false时接收系统广播正常吗?
【发布时间】:2016-11-20 11:32:58
【问题描述】:

背景

我有一个广播接收器,它为系统广播声明了一个意图过滤器,如下所示:

<receiver android:name=".StartAppReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

接收器正在正确接收广播。但是,根据文档,此接收器已导出,因此其他应用可以向此接收器发送意图。

问题

为了防止其他应用向接收者发送意图,我可以将其标记为未导出 (android:exported="false")。我希望这也能阻止系统向它发送意图,从而阻止它接收BOOT_COMPLETED 广播。

然而,尽管没有被导出,它仍然会收到BOOT_COMPLETED 广播,这不是我所期望的行为。我已在以下时间确认了此行为:

  • 索尼 Xperia M(Android 4.3 和 Android 7.1)
  • Genymotion 模拟器 (Android 6)
  • 官方模拟器(Android 4.0.1)

我也用android.intent.action.MY_PACKAGE_REPLACED 广播尝试过这个,得到了同样的结果。

我想要的行为,但我希望exported="false" 阻止它接收系统广播,因为它们不是来自我的应用程序。

我可以在导出的广播接收器中接收系统广播是否正常?我可以依赖这种行为吗?

【问题讨论】:

    标签: android broadcastreceiver intentfilter


    【解决方案1】:

    根据我的经验,模拟器不能作为调用应用程序的良好测试平台。我使用模拟器来调整布局大小和渲染 GL 线程。这可能会帮助您走上正确的道路。

    您可以限制并找出调用意图的包并在您的 onReceive() 中将其过滤掉。

    How to get the sender of an Intent?

    干杯!

    【讨论】:

      【解决方案2】:

      为了防止接收广播就放

      enabled:false
      

      在您的接收者标签中

      【讨论】:

      • 看起来它可以阻止接收广播,但我确实想接收广播。 (请注意,我在问题中说This is the behaviour I want。)我试图找出尽管设置了exported=true,但我收到广播是否是正常且可靠的行为。我刚刚更新了问题以试图澄清这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多