以下是我的客户代码:
public class GCMIntentService extends GCMBaseIntentService {
public GCMIntentService() {
super(SENDER_ID);
}
@Override
protected void onError(Context arg0, String arg1) {
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
Context context = getApplicationContext();
String NotificationContent = arg1.getStringExtra("message");
System.out.println("Message: " + NotificationContent);
}
@Override
protected void onRegistered(Context arg0, String arg1) {
System.out.println("Registered id: " + arg1);
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
System.out.println("Unregistered id: " + arg1);
}
}
以及注册和注销方法如下:
public void Registering() {
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
RegistrationId = GCMRegistrar.getRegistrationId(this);
if(RegistrationId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
}
}
public void Unregistering() {
Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
startService(unregIntent);
}
在同一设备上,第一次调用
Registering()
,我得到了registered_id_1
。我叫
Unregistering()
,它将打印:Unregistered id: registered_id_1
表示注销成功。并再次调用
Registering()
,它将获得另一个registered_id_2
。我将推送通知服务器发送消息到
registered_id_1
,如下代码:Sender sender = new Sender("Android API Key");// Android API KEY
Message message = new Message.Builder().addData("message", My Message).build();
Result result = null;
try {
result = sender.send(message, registered_id_1, 5);
} catch (IOException e) {
e.printStackTrace();
}
但是客户端仍然收到发送到
registered_id_1
的消息。我的方法有什么问题?
最佳答案
您的方法没有错。这就是GCM的行为。当设备获得给定应用程序的新注册ID时,先前为此设备和应用程序分配的旧注册ID仍将起作用。如果您使用旧的注册ID发送GCM消息,则会收到包含规范注册ID(其值为该设备的新注册ID)的响应。收到此类响应时,应从服务器的数据库中删除旧的注册ID。
或者,如果注销旧的注册ID时还通知服务器,则服务器会更好地处理该问题,这将删除旧的注册ID,并且不再尝试向其发送消息。
关于android - GCM在Android上实现推送通知,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22629764/