不止一个BroadcastReceiver用于相同的Intent,具有相互矛盾的文档和实践

Rog*_*nns 28 android broadcastreceiver

Google Analytics for Android文档中,它有一条说明:

注意:每个应用程序只能指定一个BroadcastReceiver类.如果您需要合并来自不同SDK的两个或更多BroadcastReceiver,您将需要创建自己的BroadcastReceiver类,该类将接收所有广播并为每种类型的广播调用适当的BroadcastReceivers.

虽然有些令人困惑,但在该陈述中似乎没有单一的事实要素.特别是你可以在一个应用程序中有多个接收器,它们工作得很好.其他地方已将此解释为意味着您不能为特定的Intent操作提供多个接收器.然而,在我的测试中,包括Tablet/3.2设备以及G1/1.6设备,我确实看到com.android.vending.INSTALL_REFERRER的所有广播接收器确实被调用.

我已经实现了一个接收器,它将根据某个配置调用其他接收器并使用PackageManager更新它,并从清单中获取条目,但这一切看起来完全没必要.

那么真相是什么?分析文档是完整的内容还是注释背后有一些真相?

Rog*_*nns 22

回答我自己的问题.Android系统可以很好地与多个接收器完美配合.它将按预期调用所有这些.

Android Market/Play商店/ Finsky被刻意写入不使用标准的Android练习,故意确保只调用第一个.因此,您必须按照分析页面上的描述进行多路复用,而不是信任引用测试工具.

onReceive方法中的这段代码可以让你找到所有的接收器.

// clear out classname
intent.setComponent(null);
// do what Market/Store/Finsky should have done in the first place
List<ResolveInfo> l=context.getPackageManager().queryBroadcastReceivers(intent, 0);
Run Code Online (Sandbox Code Playgroud)

然后查看每个ResolveInfo中的applicationInfo,并使用该名称(在检查导出和启用后),并且不要自己调用.

我更新了推荐测试程序以匹配市场/商店行为,并使测试安装引用更容易.请参阅https://github.com/rogerbinns/referraltester

  • 这个问题仍然有效吗?在当前的Android版本中是否也会发生相同的行为? (5认同)

cis*_*rns 5

我不确定我理解Google Analytics SDK文档中的警告是什么,但我怀疑它们意味着您不能使用不同的过滤器两次注册同一个类.但是我知道你可以拥有多个广播接收器.

所以例如我认为这不起作用:

<receiver android:name="com.sample.myapp.MyAnalyticsReceiver" android:exported="true">
  <intent-filter>
    <action android:name="com.android.vending.INSTALL_REFERRER" />
  </intent-filter>
</receiver>
<receiver android:name="com.sample.myapp.MyAnalyticsReceiver" android:exported="true">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

不过我知道这样做:

<receiver android:name="com.sample.myapp.MyAnalyticsReceiver" android:exported="true">
  <intent-filter>
    <action android:name="com.android.vending.INSTALL_REFERRER" />
  </intent-filter>
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

这也适用于安装监视相同广播事件的不同接收器:

<receiver android:name="com.google.android.apps.analytics.AnalyticsReceiver" android:exported="true">
  <intent-filter>
    <action android:name="com.android.vending.INSTALL_REFERRER" />
  </intent-filter>
</receiver>
<receiver android:name="com.sample.myapp.MyAnalyticsReceiver" android:exported="true">
  <intent-filter>
    <action android:name="com.android.vending.INSTALL_REFERRER" />
  </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

我在Android Developer文档中找不到任何可以解释警告的内容.警告的另一个原因是,如果INSTALL_REFERRER意图作为有序广播发送,默认的Google Analytics Receiver会中止进一步广播,不太可能但是可能 - 因为该意图来自Google Market/Play应用,INSTALL_REFERRER消息的行为已经改变了不同的版本.