Более одного BroadcastReceiver для одного и того же намерения с противоречивым документом и практикой - PullRequest
28 голосов
/ 14 марта 2012

В документации для Google Analytics для Android есть примечание:

Примечание. Для одного приложения можно указать только один класс BroadcastReceiver. Если вам необходимо включить два или более BroadcastReceivers из разных SDK, вам необходимо создать собственный класс BroadcastReceiver, который будет принимать все широковещательные сообщения и вызывать соответствующие BroadcastReceivers для каждого типа широковещательной передачи.

Несмотря на некоторую путаницу, в этом утверждении, похоже, нет ни единого элемента правды. В частности, у вас может быть несколько приемников в приложении, и они работают просто отлично. В других местах это объясняется тем, что у вас не может быть более одного получателя для определенного намеренного действия. Однако в моем тестировании, в том числе на устройстве Tablet / 3.2, а также на устройстве G1 / 1.6, я вижу, что все широковещательные приемники для com.android.vending.INSTALL_REFERRER действительно называются.

Я реализовал приемник, который будет вызывать других на основе некоторого конфига, и обновлял его, используя вместо этого PackageManager и получая записи из манифеста, но все это кажется совершенно ненужным.

Так в чем же правда? Является ли документ аналитики полным обманом или в записке есть доля правды?

Ответы [ 3 ]

22 голосов
/ 06 июня 2012

Отвечая на мой собственный вопрос. Система Android прекрасно работает с несколькими приемниками для одного и того же намерения. Он вызовет их все как положено.

Android Market / Play Store / 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);

Затем посмотрите в applicationInfo в каждом ResolveInfo и используйте имя (после проверки экспорта и включения) и не называйте себя.

Я обновил Referral Tester, чтобы он соответствовал поведению Market / Store и упростил тестирование ссылок для установки. Смотри https://github.com/rogerbinns/referraltester

5 голосов
/ 14 марта 2012

Я не уверен, что понимаю, о чем идет речь в документе 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>

Однако я знаю, что это делает:

<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>

Это также работает для установки различных приемников, отслеживающихте же события трансляции:

<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>

В документации Android Developer я не нашел ничего, что могло бы объяснить предупреждение.Единственная другая причина предупреждения заключается в том, что намерение INSTALL_REFERRER отправляется как заказанная трансляция, а приемник Google Analytics по умолчанию прерывает дальнейшую трансляцию, что маловероятно, но возможно - поскольку это намерение исходит из приложения Google Market / Play, поведение сообщений INSTALL_REFERRERизменилось в разных версиях.

2 голосов
/ 09 апреля 2012

Документы относятся к последнему случаю @cistearns, где 2 или более получателей зарегистрированы для INSTALL_REFERRER.

Мы попробовали именно этот случай с использованием 2 разных библиотек от 2 разных поставщиков, и поставщику второй библиотеки не удалось получить сигнал INSTALL_REFERRER в нашем производственном развертывании.

Мы предполагаем, что это объясненоиз-за проблемы, указанной в этих документах Google Analytics, - что система Android не выполняет итерацию по получателям, даже если мультипликаторы успешно зарегистрированы.Этот поставщик переписывает, чтобы включить настраиваемую схему ретрансляции .

@ cistearns, вы видели, как несколько получателей INSTALL_REFERRER вызывались отдельно?Легко ли вам опубликовать свой тестовый код?Какая версия ОС?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...