Я использую GCM - первое, что я делаю, это вызвать GCMRegistrar.getRegistrationId, чтобы узнать, зарегистрировано ли устройство. Это не (пустая строка возвращается), поэтому я делаю асинхронный вызов в GCMRegistrar.register. Как и ожидалось, моя служба намерений (полученная из GCMBaseIntentService) получает вызванный метод onRegistered() вместе с токеном, который мой сервер может использовать для отправки сообщений GCM на это устройство. Пока что так хорошо.
Однако, в следующий раз, когда я запустил приложение, я бы ожидал, что сначала вызовет GCMRegistrar.getRegistrationId, чтобы вернуть токен, который я получил в своем сервисе намерения в функцииRegistered. Но я снова получаю пустую строку. Я думал, что клиентская библиотека GCM (gcm.jar) сохранит идентификатор регистрации GCM (токен) для частного объекта SharedPreferences - на самом деле, документация для класса GCMRegistrar (http://developer.android.com/guide/google/gcm/client-javadoc/com/google/android/gcm/GCMRegistrar.html) указывает: "Этот класс использует закрытый объект SharedPreferences для отслеживания регистрационного токена"
Я не отменил регистрацию устройства, удалил приложение или обновил версию. Любые идеи, что мне не хватает? Благодаря
Примечание. Этот вопрос был опубликован в группах google под тегом android-gcm. URL-адрес здесь:
https://groups.google.com/forum/#!topic/android-gcm/4FPqZLzlvE4
Марк Мерфи (Commons Guy) был действительно полезен при первоначальном диагнозе проблемы, но ничего конкретного не появилосьUpdate Edit - вот соответствующая часть моего 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" />