好吧,我设法做到了我的自我。我会尽力解释它。所以,首先我编辑getSenderIds()方法是这样的:
@Override
protected String[] getSenderIds(Context context) {
updateSenderIdTask(context);
String[] ids = new String[1];
ids[0] = getSenderId(context);
return ids;
}
此前我已经设定的ID [0]到,我将设置updateSenderIdTask方法内的可变SENDER_ID。由于在updateSenderIdTask方法被执行之前GCM会访问SENDER_ID变量,即使我已经在基础应用程序类中调用它,也会抛出无效的发件人ID异常。所以,我在getSenderIds覆盖方法中调用了updateSenderTask,以确保在GCM使用它之前从服务器获取id。要仔细检查它,我将ids [0]设置为本地方法getSenderId。下面是它的实现:
static String getSenderId(Context context) {
CustomSharedPrefs prefs = CustomSharedPrefs.getInstance(context);
if (prefs.getString(Constants.SENDER_ID).equals("0")
|| prefs.getString(Constants.SENDER_ID) == null) {
updateSenderIdTask(context);
}
Log.e("returned sender_id", prefs.getString(Constants.SENDER_ID));
return prefs.getString(Constants.SENDER_ID);
}
的updateSenderIdTask方法获取从服务器并且将其存储在ID中的共享偏好变量。
你什么时候得到这个异常?从我在GCMBaseIntentService的代码中可以看到的内容,getSenderIds方法仅在失败后重试注册到GCM时使用。它不会影响您最初注册到GCM的代码。你是否在两个地方使用相同的发件人ID? – Eran
是的,我在每个地方都使用相同的ID。 GCMIntentService的构造函数使用发件人ID。这就是抛出异常的地方。我使用空的super()构造函数,因为java文档说你应该使用这个动态ID。 –