Прежде всего. Код повторной попытки: НЕПРАВИЛЬНО ! Да, даже люди из Google могут опубликовать неправильный код!
Метод am.set (в C2DMBaseReceiver.handleRegistration) занимает время, прошедшее с момента загрузки, в миллисекундах, в течение которого намерение должно запускаться. Мы передаем 30000, 60000, 120000 и т. Д. Все эти значения будут ХОРОШО в прошлом. То, что мы должны передать это:
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + backoffTimeMs,
retryPIntent);
Это означает, что мы говорим, что следующее намерение должно быть запущено сейчас + backOffTimeMs. Это первая ошибка в опубликованном коде.
Вторая ошибка заключается в том, что не существует BroadcastReceiver, который подключен для получения
com.google.android.c2dm.intent.RETRY
Намерение!
Итак, мы включаем следующее дополнение в файл манифеста:
<receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RETRY"/>
<category android:name="com.google.android.apps.chrometophone" />
</intent-filter>
</receiver>
(это дополнительный блок, оставьте все остальное как есть)
И вот, пожалуйста! Это начнет работать!