2016-04-11 6 views
5

Ich schreibe eine Anwendung, die mit Smooch und Carnival integriert. Diese beiden Bibliotheken empfangen GCM-Push-Nachrichten unter Verwendung des Standardansatzes zum Definieren eines GCM-Intent-Dienstes zum Empfangen von Nachrichten.Verwendung von 2 oder mehr GCM Intent Services in einer Anwendung

Wenn ich nur Smooch benutze, funktioniert alles super. Wenn ich nur Karneval benutze, funktioniert alles super. Das Problem tritt auf, wenn ich versuche, beides zu verwenden. Was ich gefunden habe, ist, dass der GCM-Empfänger einfach den ersten Dienst startet, der in dem Manifest aufgeführt ist, das die Absicht com.google.android.c2dm.intent.RECEIVE definiert.

Tatsächlich fand ich, dass die Reihenfolge der Bibliotheken in meinem build.gradle betrifft, in welcher Reihenfolge ihre Manifeste in das Manifest der Anwendung zusammengeführt werden. Also, wenn ich zuerst Knutschfleck mache, funktioniert es (aber Carnival bekommt nichts). Und wenn ich Karneval an erste Stelle setze, funktioniert es (aber Smooch bekommt nie etwas).

Wie kann ich mehrere GCM-Intent-Services verarbeiten, wenn ich keinen von beiden kontrolliere? Wie sollten Anwendungen im Allgemeinen mehrere GCM-Intent-Services definieren und verwalten?

Antwort

6

Der Grund dafür, dass Sie in Carnival und Smooch keinen Push bekommen können, ist, dass beide Bibliotheken ihren eigenen GcmListenerService registrieren und in Android der erste GcmListenerService, der in Ihrem Manifest definiert ist, alle GCM-Nachrichten empfängt.

habe ich eine Lösung für Sie in erster Linie aus dem folgenden SO Artikel basieren: Multiple GCM listeners using GcmListenerService

Die beste Lösung wäre nur eine GcmListenerService Implementierung haben, und hat diese Griff Nachrichten für beide.

Um Ihren eigenen GcmListenerService anzugeben, befolgen Sie die Anweisungen unter Google's Cloud Messaging Documentation.

Smooch bietet die Tools, die Sie benötigen, um ihre interne GCM-Registrierung zu deaktivieren, wenn Sie Ihre eigenen besitzen.

Dazu einfach setGoogleCloudMessagingAutoRegistrationEnabled nennen, während Smooch Initialisierung:

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

Und in Ihrem eigenen GcmRegistrationIntentService, rufen Smooch.setGoogleCloudMessagingToken(token); mit Ihrem Token.

Sobald dies abgeschlossen ist, können Sie die GCM-Nachricht an einen beliebigen GCM-Empfänger weiterleiten.

@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); 
    } 
} 

EDIT

Ab Smooch Version 3.2.0 können Sie jetzt auch ausgelöst, leichter Mitteilung des Smooch von GcmService.triggerSmoochGcm in Ihrem onMessageReceived aufrufen.

@Override 
public void onMessageReceived(String from, Bundle data) { 
    final String smoochNotification = data.getString("smoochNotification"); 

    if (smoochNotification != null && smoochNotification.equals("true")) { 
     GcmService.triggerSmoochGcm(data, this); 
    } 
} 
+0

Danke, es ist großartig zu sehen, dass Smooch die Möglichkeit dazu bietet. Leider bin ich mir sicher Karneval nicht. Allerdings sollte ich in der Lage sein, den gleichen Ansatz zu verwenden und 'startWakefulService' zweimal mit jedem Dienst aufzurufen und sicherzustellen, dass mein Relaying Intent-Dienst zuerst im Manifest aufgeführt wird. Werde das versuchen und hier updaten. –

+0

Das funktioniert. Ich muss die GCM-Registrierung nicht deaktivieren und mache meine eigene, da ich die gleiche Absender-ID und den gleichen API-Schlüssel für beide Dienste verwende. Außerdem kann ich das smoochNotification-Flag verwenden, um die Nachricht an den richtigen Ort zu senden und nicht einfach blind an beide zu senden. Also, alles gut ... Danke! –

0

Sie verwenden beide als Graddle-Abhängigkeiten? Sie müssen beide Bibliotheken herunterladen und sie als Module verwenden, sie verwenden wahrscheinlich die gleichen Dienste, wenn Sie sie herunterladen, können Sie den Namen der Dienste ändern und jedes Problem lösen, das beide korrelieren kann.

Meine Vermutung ist, dass Sie den GCM-Broadcast-Empfänger wahrscheinlich mit Ihrem App-Modul erstellen müssen (selbst wenn er die libs-Dienste aufruft).

+0

Entschuldigung, ich verstehe Ihre Antwort nicht. Die Servicenamen sind nicht das Problem - sie haben beide bereits eindeutige Namen. Ich habe überlegt, meinen eigenen Dienst zu definieren, um die anderen beiden zu nennen, aber es scheint mit Problemen behaftet zu sein. –