我正在实施 GCM - 我做的第一件事是调用 GCMRegistrar.getRegistrationId 来查看设备是否已注册。不是(返回空字符串),所以我对 GCMRegistrar.register 进行了异步调用。正如预期的那样,我的意图服务(从 GCMBaseIntentService 派生)调用了它的 onRegistered() 方法,以及我的服务器可以用来向该设备发送 GCM 消息的令牌。到现在为止还挺好。
但是,下次我运行该应用程序时,我希望第一次调用 GCMRegistrar.getRegistrationId 以返回我在意图服务的 onRegistered 函数中返回的令牌。但我又得到了空字符串。我认为 GCM 客户端库(gcm.jar)会将 GCM 注册 ID(令牌)保存到私有 SharedPreferences 对象——事实上,GCMRegistrar 类的文档(http://developer.android.com/guide/ google/gcm/client-javadoc/com/google/android/gcm/GCMRegistrar.html)声明“注意:此类使用私有 SharedPreferences 对象来跟踪注册令牌”
我没有取消注册设备、卸载应用程序或更新版本代码。有什么我想念的想法吗?谢谢
注意——这个问题已经发布在 android-gcm 标签下的谷歌群组中。网址在这里:
https://groups.google.com/forum/#!topic/android-gcm/4FPqZLzlvE4
马克·墨菲(Commons Guy)对问题的初步诊断非常有帮助,但没有具体的问题浮出水面
更新编辑 - 这是我的 AndroidManifest.xml 的相关部分
<receiver android:name=".push.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.myapp.package.name" />
</intent-filter>
</receiver>
<service android:name=".push.GCMIntentService" />