Uso de 2 o más servicios de intención GCM en una aplicación

Estoy escribiendo una aplicación que se integra con Smooch y Carnival . Ambas bibliotecas reciben mensajes push de GCM utilizando el enfoque estándar de definir un servicio de intención GCM para recibir mensajes.

Cuando uso sólo Smooch, todo funciona muy bien. Cuando uso sólo Carnaval, todo funciona muy bien. El problema aparece cuando intento usar ambos. Lo que he encontrado es que el receptor GCM simplemente iniciará el primer servicio listado en el manifiesto que define la intención com.google.android.c2dm.intent.RECEIVE .

De hecho, encontré que el orden en que las bibliotecas aparecen en mi build.gradle afecta en qué orden se fusionan sus manifiestos en el manifiesto de aplicación. Así que, si puse smooch primero, funciona (pero Carnival no recibe nada). Y si pongo Carnaval primero, funciona (pero Smooch nunca recibe nada).

¿Cómo puedo manejar múltiples servicios de intención GCM cuando no controlo ninguno de los dos? En general, ¿cómo deberían las aplicaciones definir y administrar múltiples servicios de intención GCM?

La razón por la que no se puede obtener push para trabajar en Carnival y Smooch es que ambas bibliotecas están registrando su propio GcmListenerService, y en Android el primer GcmListenerService definido en su manifiesto recibirá todos los mensajes de GCM.

Tengo una solución para usted basada principalmente en el siguiente artículo de SO: Múltiples oyentes de GCM que utilizan GcmListenerService

La mejor solución sería simplemente tener una implementación GcmListenerService, y tener esto manejar mensajes para ambos.

Para especificar su propio GcmListenerService, siga las instrucciones de la documentación de Cloud Messaging de Google .

Smooch proporciona las herramientas necesarias para que deshabilites su registro interno de GCM cuando tengas tu propio.

Para ello, simplemente llame a setGoogleCloudMessagingAutoRegistrationEnabled al inicializar Smooch:

 Settings settings = new Settings("<your_app_token>"); settings.setGoogleCloudMessagingAutoRegistrationEnabled(false); Smooch.init(this, settings); 

Y en su propio GcmRegistrationIntentService , llame a Smooch.setGoogleCloudMessagingToken(token); Con su ficha.

Una vez que esté completo, podrá pasar el mensaje GCM a cualquier receptor GCM que desee.

 @Override public void onMessageReceived(String from, Bundle data) { final String smoochNotification = data.getString("smoochNotification"); if (smoochNotification != null && smoochNotification.equals("true")) { data.putString("from", from); Intent intent = new Intent(); intent.putExtras(data); intent.setAction("com.google.android.c2dm.intent.RECEIVE"); intent.setComponent(new ComponentName(getPackageName(), "io.smooch.core.GcmService")); GcmReceiver.startWakefulService(getApplicationContext(), intent); } } 

EDITAR

A partir de Smooch versión 3.2.0, ahora puede activar más fácilmente la notificación de Smooch llamando a GcmService.triggerSmoochGcm en su onMessageReceived.

 @Override public void onMessageReceived(String from, Bundle data) { final String smoochNotification = data.getString("smoochNotification"); if (smoochNotification != null && smoochNotification.equals("true")) { GcmService.triggerSmoochGcm(data, this); } } 

¿Está utilizando ambos como dependencias gradle? Tendrás que descargar las dos bibliotecas y usarlas como módulos, probablemente estén usando los mismos servicios, si las descargas puedes cambiar el nombre de los servicios y resolver cualquier problema que pueda corelating ambos.

Mi conjetura es que usted tendrá que probablemente crear el receptor de la difusión de GCM con de su módulo de la aplicación (aunque él llame los servicios de las libs).

  • ID de registro canónico y formato ID de mensaje
  • Cómo saber si mi aplicación está abierta cuando administré una notificación push
  • 2 usuarios que usan el mismo dispositivo y la misma aplicación, pero diferente id de inicio - tienen diferentes id de registro gcm?
  • Validación de Token GCM
  • ¿Cómo podría Intent ser nulo en onHandleIntent ()?
  • Elementos de DOM de control de la aplicación de Android
  • Varios mensajes push: El contenido del adaptador ha cambiado pero ListView no ha recibido ninguna notificación
  • Android GCM enciende las luces
  • Google Cloud Messaging: los mensajes se reciben de forma instantánea o con demora prolongada
  • HttpRetryExcepiton al intentar enviar mensaje gcm
  • Android - FirebaseApp / Firebase-Inicialización no se inicia
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.