Может ли это быть случаем, когда Google обновляет регистрационный идентификатор?Из документов C2DM для Поток жизненного цикла в разделе Включение C2DM ...
...
2. При регистрацииПри успешном выполнении сервер C2DM передает намерение РЕГИСТРАЦИЯ, которое дает приложению регистрационный идентификатор.
Приложение должно сохранить этот идентификатор для последующего использования. Обратите внимание, что Google может периодически обновлять регистрационный идентификатор, поэтому вы должны разработать свое приложение с учетом того, что намерение РЕГИСТРАЦИИ может вызываться несколько раз. Ваше приложение должно иметь возможность отвечать соответствующим образом.
...
Идентификатор регистрации действует до тех пор, пока приложение явно не отменит свою регистрацию, или пока Google не обновит регистрационный идентификатор для вашего приложения.
документация, в которой говорится, что в результате перерегистрации будет отправлено намерение с дополнительным «незарегистрированным».Единственное упомянутое время - это когда приложение явно отменяет регистрацию.
Глядя на ваш код, оно кажется неполным - неясно, как вы справляетесь с регистрацией или возможностью повторной регистрации (когда Google обновляетрегистрационный идентификатор, например).
В своем ответе на мой комментарий к вашему вопросу вы говорите, что это «обычно недели».Если бы вы сказали часы (или, возможно, даже дни), я бы, вероятно, отклонил бы мысль о том, что перерегистрация вызывает проблему.Однако для обновления регистрационного идентификатора Google недели вполне приемлемы.
Просто мысль.
РЕДАКТИРОВАТЬ: Ну, пока вы счастливычто updateServerRegId()
работает правильно и обновляется с новым registration_id
(при необходимости), тогда я не вижу ничего другого, на что можно указать пальцем.
Я все еще задаюсь вопросом, является ли это случаем поддержанияневерный (истекший) идентификатор регистрации однако.Просто посмотрим на документы дальше ...
Приложение получает широковещательную рассылку РЕГИСТРАЦИЯ всякий раз, когда сервер приложений пытается отправить ему сообщение.Но регистрационные идентификаторы могут быть несуществующими или недействительными по ряду причин:
- Если приложение запускается впервые, оно еще не имеет регистрационного идентификатора.
- Если приложение незарегистрировано, у него нет регистрационного идентификатора.
- Сервер C2DM периодически обновляет регистрационные идентификаторы.
При условии, что первые два не применяются, оставляя только последние.
Вы говорите в своем первоначальном вопросе, что «я получаю устройства, которые неожиданно были незарегистрированными, и поэтому прекращаю получать сообщения».Вы смотрели на возможные коды ошибок в ответе 200 при отправке сообщений на эти устройства?Посмотрите на раздел кода ответа Как сервер приложений отправляет сообщения , это может дать вам лучшее представление о том, что происходит.
Кстати, одна вещь, возможно, не связанная (но я думал, что яупомяну это) ...
if (error == "SERVICE_NOT_AVAILABLE")
... не сравнивайте Strings
с использованием ==
, всегда используйте .equals(...)
.Если по пути вы получаете ошибки, сравнение строк ошибок таким способом не сработает, и вы можете что-то упустить.