2012-03-14 9 views
25

En el documentation for Google Analytics for Android tiene una nota que dice:Más de un BroadcastReceiver por la misma intención con doc contradictoria y la práctica

Nota: Sólo una clase BroadcastReceiver se puede especificar por aplicación. Si necesita incorporar dos o más BroadcastReceivers de diferentes SDK, deberá crear su propia clase BroadcastReceiver que recibirá todas las transmisiones y llamará a los BroadcastReceivers apropiados para cada tipo de difusión.

Aunque algo confuso no parece haber un solo elemento de verdad en esa afirmación. En particular, puede tener múltiples receptores en una aplicación y funcionan muy bien. Otros lugares han interpretado que esto significa que no puedes tener más de un receptor para una acción de intención en particular. Sin embargo, en mis pruebas, incluso en un dispositivo Tablet/3.2 y un dispositivo G1/1.6, sí veo que se llaman todos los receptores de difusión para com.android.vending.INSTALL_REFERRER.

He implementado un receptor que llamará a otros en función de algunas configuraciones y lo estaba actualizando, use el PackageManager y obtenga entradas del manifiesto, pero todo esto parece completamente innecesario.

¿Cuál es la verdad? ¿El documento de análisis es una olla completa o hay algo de verdad detrás de la nota?

+0

Duplicado de http://stackoverflow.com/questions/8013628/are-multiple-broadcast-receivers-legal-in-android –

+2

¡Parece que eso, aunque las dos respuestas dadas para eso están incompletas o son incorrectas! –

Respuesta

21

Respondiendo a mi propia pregunta.El sistema Android funciona perfectamente bien con múltiples receptores para el mismo propósito. Los llamará a todos como se esperaba.

Android Market/Play Store/Finsky ha sido escrito deliberadamente para no usar la práctica estándar de Android y se asegura deliberadamente de que solo se llame a la primera. En consecuencia, debe realizar la multiplexación tal como se describe en la página de análisis, y no confiar en las herramientas de prueba de referencia.

Este código en el método onReceive le permitirá encontrar todos los receptores.

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

luego buscar en el applicationInfo en cada ResolveInfo, y usar el nombre (después de comprobar exportado y está activado) y no llaman a sí mismo.

He actualizado el Probador de referencias para que coincida con el comportamiento de Market/Store y facilite las pruebas de las referencias de instalación. Ver https://github.com/rogerbinns/referraltester

+5

¿Este problema sigue siendo válido? ¿El mismo comportamiento ocurre en las versiones actuales de Android? – rampr

4

No estoy seguro de entender de qué trata la advertencia en el documento SDK de Google Analytics, pero sospecho que significa que no puede registrar la misma clase dos veces con diferentes filtros. Sin embargo, sé que puede tener múltiples receptores de difusión.

Así, por ejemplo, no creo que esto funciona:

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

Sin embargo sé que esto hace:

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

Esto también funciona para la instalación de diferentes receptores seguimiento de los mismos eventos de difusión:

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

No encontré nada en la documentación del desarrollador de Android que explique la advertencia. La única otra razón para la advertencia es si el intento de INSTALL_REFERRER se envía como transmisión ordenada y el receptor de Google Analytics predeterminado interrumpe la transmisión, improbable pero posible, ya que esa intención proviene de la aplicación Google Market/Play, el comportamiento de los mensajes INSTALL_REFERRER ha cambiado con diferentes versiones.

+0

El primer caso funciona bien en G1/1.6 y Tablet/3.2. Hay un mensaje de logcat cuando se instala el apk que enumera los receptores y hay uno por cada sección en el mismo orden que el manifiesto, incluidos los duplicados. También PackageManager.queryBroadcastReceivers() devuelve los "dupes" como se esperaba. No puedo encontrar un solo caso en el que los BroadcastReceivers no funcionen como se espera ni ninguna verdad en ninguna de las advertencias analíticas. –

2

Los documentos se refieren a @cistearns en el último caso, donde 2 o más receptores están registrados para INSTALL_REFERRER.

Hemos intentado este mismo caso utilizando 2 bibliotecas diferentes de 2 proveedores diferentes, y el proveedor de la segunda biblioteca no pudo obtener la señal INSTALL_REFERRER en nuestra implementación de producción.

Suponemos que esto se explica por el problema indicado en los documentos de Google Analytics: que el sistema Android no se está iterando a través de los receptores, incluso cuando los múltiples se registran correctamente. Ese vendedor está reescribiendo para habilitar un custom 'rebroadcast' scheme.

@cistearns, ¿vio varios receptores INSTALL_REFERRER llamando por separado? ¿Es fácil para usted publicar su código de prueba? ¿Qué versión del sistema operativo?

+0

Escribí un esquema de retransmisión personalizado, y luego en mis pruebas descubrí que no era necesario ni siquiera en un G1 con Android 1.6. He tenido 3 receptores diferentes para el intento y los 3 funcionaron bien. También he usado apktool para ver otros, y encontré uno enviado con 4 receptores. Tenga en cuenta que hay un límite de tiempo de 10 segundos, así que tal vez llegue a eso. –

Cuestiones relacionadas