Подтвердить что ты не робот

Более одного BroadcastReceiver для одного и того же намерения с противоречивым документом и практикой

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

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

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

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

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

4b9b3361

Ответ 1

Отвечая на мой вопрос. Система 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

Ответ 2

Я не уверен, что понимаю, что такое предупреждение в документе SDK Google Analytics, но я подозреваю, что они не могут зарегистрировать один и тот же класс дважды с разными фильтрами. Однако я знаю, что вы можете иметь несколько приемников вещания.

Так, например, я не думаю, что это работает:

<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, которая объяснила бы это предупреждение. Единственная причина для предупреждения заключается в том, что намерение INSTALL_REFERRER отправлено как заказная трансляция, а приемник Google Analytics по умолчанию отменяет дальнейшую трансляцию, что маловероятно, но возможно - поскольку это намерение исходит из приложения Google Market/Play, поведение сообщений INSTALL_REFERRER изменился с разными версиями.

Ответ 3

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

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

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

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