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

  • Solicitud del ID de registro de Google Cloud Messaging (GCM) cada vez que se inicia la aplicación
  • Parse push notificación token del dispositivo android no guardado en algunos casos
  • ¿Es bueno usar sólo GCM para el desarrollo de aplicaciones de chat para android ditching XMPP?
  • ¿Cambia el Id de registro cuando el usuario actualiza o reinstala la aplicación
  • Cómo contar android gcm carga útil
  • Google Cloud Messaging - CCS (XMPP) vs servidor HTTP
  • ¿Por qué obtengo "MismatchSenderId" desde el lado del servidor GCM?
  • ¿Es posible usar GCM para enviar notificaciones push entre diferentes aplicaciones?
  • ¿Cómo eliminar una notificación push de Android desde el centro de notificaciones cuando la aplicación se inicia con su icono de lanzador?
  • GCM getToken () envía java.io.IOException: TIMEOUT
  • Los mensajes de GCM mueren en silencio de "Aceptado".
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.