tutorial start sendbroadcast registerreceiver oreo example connectivity_change android broadcastreceiver

android - start - Más de un BroadcastReceiver para el mismo intento con documentación y práctica contradictorias



start broadcast receiver android (3)

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

Probamos 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 debido al problema indicado en los documentos de Google Analytics: que el sistema Android no está iterando a través de los receptores, incluso cuando los múltiplos se registran con éxito. Ese proveedor está reescribiendo para habilitar un esquema de ''retransmisión'' personalizado .

@cistearns, ¿viste que varios receptores INSTALL_REFERRER fueron llamados por separado? ¿Es fácil para usted publicar su código de prueba? ¿Qué versión de SO?

En la documentación de Google Analytics para Android , hay una nota que dice:

Nota: solo se puede especificar una clase BroadcastReceiver 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 adecuados para cada tipo de difusión.

Aunque algo confuso, no parece haber un solo elemento de verdad en esa declaración. En particular, puede tener varios receptores en una aplicación y funcionan bien. Otros lugares han interpretado que esto significa que no puede tener más de un receptor para una acción de Intención en particular. Sin embargo, en mis pruebas, incluidas en un dispositivo Tablet / 3.2, así como en un dispositivo G1 / 1.6, veo que todos los receptores de difusión para com.android.vending.INSTALL_REFERRER son de hecho llamados.

He implementado un receptor que llamará a otros en función de alguna configuración y lo estaba actualizando. En su lugar, utilice PackageManager y obtenga entradas del manifiesto, pero todo esto parece completamente innecesario.

Entonces, ¿cuál es la verdad? ¿El análisis analítico es un completo problema o hay algo de verdad detrás de la nota?


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

Entonces, por ejemplo, no creo que esto funcione:

<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 instalar diferentes receptores que monitorean los mismos eventos de transmisió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 de Android Developer que explicara la advertencia. La única otra razón para la advertencia es si el intento INSTALL_REFERRER se envía como una transmisión ordenada y el receptor predeterminado de Google Analytics aborta la transmisión adicional, poco probable pero posible, ya que ese intento proviene de la aplicación Google Market / Play, el comportamiento de los mensajes INSTALL_REFERRER Ha cambiado con diferentes versiones.


Respondiendo a mi propia pregunta. El sistema Android funciona perfectamente bien con múltiples receptores para la misma intención. Los llamará a todos como se espera.

Android Market / Play Store / Finsky ha sido escrito deliberadamente para no usar la práctica estándar de Android y asegura deliberadamente que solo se llame al primero. Por consiguiente, debe realizar la multiplexación como se describe en la página de análisis y no confiar en las herramientas del comprobador de referencias.

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 mire la información de aplicación en cada ResolveInfo, y use el nombre (después de verificar exportar y habilitar), y no se llame.

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