web-dev-qa-db-fra.com

Plus d'un BroadcastReceiver pour la même intention avec doc et pratique contradictoires

Dans la documentation de Google Analytics pour Android il y a une note disant:

Remarque: Une seule classe BroadcastReceiver peut être spécifiée par application. Si vous avez besoin d'incorporer deux ou plusieurs BroadcastReceivers à partir de différents SDK, vous devrez créer votre propre classe BroadcastReceiver qui recevra toutes les diffusions et appeler les BroadcastReceivers appropriés pour chaque type de diffusion.

Bien que quelque peu déroutant, il ne semble pas y avoir un seul élément de vérité dans cette déclaration. En particulier, vous pouvez avoir plusieurs récepteurs dans une application et ils fonctionnent très bien. D'autres endroits ont interprété cela comme signifiant que vous ne pouvez pas avoir plus d'un récepteur pour une action d'intention particulière. Cependant, lors de mes tests, y compris sur un périphérique Tablet/3.2 ainsi que sur un périphérique G1/1.6, je constate que tous les récepteurs de diffusion pour com.Android.vending.INSTALL_REFERRER sont en effet appelés.

J'ai implémenté un récepteur qui appellera les autres en fonction d'une configuration et le mettais à jour en utilisant le PackageManager à la place et en obtenant des entrées du manifeste, mais tout cela semble complètement inutile.

Alors quelle est la vérité? Le document analytique est-il un pot complet ou y a-t-il une part de vérité derrière la note?

28
Roger Binns

Répondre à ma propre question. Le système Android fonctionne parfaitement avec plusieurs récepteurs dans le même but. Il les appellera tous comme prévu.

Android Market/Play Store/Finsky a été délibérément écrit pour ne pas utiliser la norme Android pratique et s'assure délibérément que seul le premier est appelé. Par conséquent, vous devez faire le multiplexage comme décrit sur la page d'analyse et ne pas faire confiance aux outils de test de référence.

Ce code dans la méthode onReceive vous permettra de trouver tous les récepteurs.

// 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);

Ensuite, regardez dans l'applicationInfo dans chaque ResolveInfo, et utilisez le nom (après avoir vérifié exporté et activé), et ne vous appelez pas.

J'ai mis à jour Referral Tester pour correspondre au comportement du marché/magasin et pour faciliter le test des référents d'installation. Voir https://github.com/rogerbinns/referraltester

22
Roger Binns

Je ne suis pas sûr de comprendre en quoi consiste l'avertissement dans le document SDK de Google Analytics, mais je pense qu'ils signifient que vous ne pouvez pas enregistrer deux fois la même classe avec des filtres différents. Cependant, je sais que vous pouvez avoir plusieurs récepteurs de diffusion.

Ainsi, par exemple, je ne pense pas que cela fonctionne:

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

Cependant, je sais que cela:

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

Cela fonctionne également pour l'installation de différents récepteurs surveillant les mêmes événements de diffusion:

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

Je n'ai rien trouvé dans la documentation Android Developer expliquant l'avertissement. La seule autre raison de l'avertissement est que l'intention INSTALL_REFERRER est envoyée en tant que diffusion ordonnée et que le récepteur Google Analytics par défaut abandonne la diffusion ultérieure. , peu probable mais possible - comme cette intention provient de l'application Google Market/Play, le comportement des messages INSTALL_REFERRER a changé avec différentes versions.

5
cistearns

Les documents font référence au dernier cas @cistearns, où 2 récepteurs ou plus sont enregistrés pour INSTALL_REFERRER.

Nous avons essayé ce cas en utilisant 2 bibliothèques différentes de 2 fournisseurs différents, et le fournisseur de la deuxième bibliothèque n'a pas réussi à obtenir le signal INSTALL_REFERRER dans notre déploiement de production.

Nous supposons que cela est expliqué en raison du problème indiqué dans ces documents Google Analytics - que le système Android n'itère pas via les récepteurs même lorsque les multiples sont enregistrés avec succès. Ce fournisseur réécrit pour activer un schéma de "rediffusion" personnalisé .

@cistearns, vous avez vu plusieurs récepteurs INSTALL_REFERRER appelés séparément? Est-il facile pour vous de poster votre code de test? Quelle version d'OS?

2
larham1