Siehe die aktualisierte GCM API Docs wie @morepork schlägt vor.
Für bestehende Anwendungen, die eine WakefulBroadcastReceiver erweitern, Google empfiehlt zu GCMReceiver und GcmListenerService migrieren. Um Migrate:
Im App-Manifest, ersetzen Sie Ihre GcmBroadcastReceiver mit "com.google.android.gms.gcm.GcmReceiver", und ersetzen Sie die aktuellen Service-Erklärung, die IntentService zum neuen GcmListenerService
entfernen die sich BroadcastReceiver Implementierung von Ihrem Client-Code
Umgestalten der aktuelle IntentService Service-Implementierung GcmListenerService
Einzelheiten zu verwenden, siehe das Beispiel manifestiert und Code-Beispiele auf dieser Seite.
Von ihrem sample code ist es ziemlich einfach zu folgen.
AndroidManifest.xml
<receiver
android:exported="true"
android:name="com.google.android.gms.gcm.GcmReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="com.example.client"/>
</intent-filter>
</receiver>
<service
android:name=".MyGcmListenerService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
</intent-filter>
</service>
<service
android:name=".MyInstanceIdListenerService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID"/>
</intent-filter>
</service>
<service
android:name=".MyGcmRegistrationService"
android:exported="false">
</service>
MyGcmListenerService.java
public class MyGcmListenerService extends GcmListenerService {
@Override
public void onMessageReceived(String from, Bundle data) {
final String message = data.getString("message");
makeNotification(message);
}
}
MyGcmRegistrationService.java
public class MyGcmRegistrationService extends IntentService {
private static final String TAG = "MyRegistrationService";
private static final String GCM_SENDER_ID = "XXXXXXXXXXXX";
private static final String[] TOPICS = {"global"};
public MyGcmRegistrationService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
try {
synchronized (TAG) {
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(GCM_SENDER_ID,
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
sendTokenToServer(token);
subscribeTopics(token);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void subscribeTopics(String token) throws IOException {
for (String topic : TOPICS) {
GcmPubSub pubSub = GcmPubSub.getInstance(this);
pubSub.subscribe(token, "/topics/" + topic, null);
}
}
}
MyInstanceIdListenerService.java
public class MyInstanceIdListenerService extends InstanceIDListenerService {
public void onTokenRefresh() {
Intent intent = new Intent(this, MyGcmRegistrationService.class);
startService(intent);
}
}
Dann können Sie Ihre alten Registrierungscode mit nur ersetzen
Intent intent = new Intent(this, MyGcmRegistrationService.class);
startService(intent);
Können Sie bitte erarbeiten ... Ist dies die Log-Nachricht, die Sie bekommen? Verwenden Sie APIs oder Bibliotheken von Drittanbietern? – AniV
Das obige Paket ist ein Kopieren/Einfügen vom Debugger - es ist ein Objekt innerhalb der Absicht, die ich mit meinem Empfänger erhalte. Ich bekomme es mit 'intent.getExtras()' erwartet einen Typ und eine Nachricht, anstatt die Karte oben zu bekommen. Ich verwende einige Drittanbieter-Bibliotheken wie Picasso und Okhttp, aber nichts zu obskures oder in diesem Bereich. Keine APIs von Drittanbietern außer Google (Analytics, Speicher, gcm) – vkislicins
Auch scheint es, dass ich diese Nachricht nur beim ersten Start der App bekomme. Wenn Sie die Anwendung anhalten und die Daten löschen, wird die Nachricht nicht erneut angezeigt. – vkislicins