按照@morepork 的建议查看更新后的GCM API Docs。
对于扩展 WakefulBroadcastReceiver 的现有应用,Google
建议迁移到 GCMReceiver 和 GcmListenerService。到
迁移:
在应用清单中,将您的 GcmBroadcastReceiver 替换为“com.google.android.gms.gcm.GcmReceiver”,并将当前将 IntentService 扩展为新 GcmListenerService 的服务声明替换
从您的客户端代码中删除 BroadcastReceiver 实现
重构当前 IntentService 服务实现以使用 GcmListenerService
有关详细信息,请参阅此页面中的示例清单和代码示例。
从他们的sample code,很容易理解。
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);
}
}
然后您可以将旧的注册码替换为
Intent intent = new Intent(this, MyGcmRegistrationService.class);
startService(intent);