C2DM попытка регистрации - PullRequest
2 голосов
/ 04 марта 2011

Я использую C2DM, и он работает нормально, если регистрация прошла успешно. Но иногда регистрация заканчивается неудачей, и затем она пытается зарегистрироваться позже:

Intent retryIntent = new Intent(C2DM_RETRY);
PendingIntent retryPIntent = PendingIntent.getBroadcast(context, 
        0 /*requestCode*/, retryIntent, 0 /*flags*/);

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.ELAPSED_REALTIME,
             backoffTimeMs, retryPIntent);

Но что делать, если диспетчер сигналов тревоги запускает это намерение? я должен поймать это? Потому что почему-то программа никогда не пытается зарегистрироваться.

1 Ответ

5 голосов
/ 05 октября 2011

Прежде всего. Код повторной попытки: НЕПРАВИЛЬНО ! Да, даже люди из 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>

(это дополнительный блок, оставьте все остальное как есть)

И вот, пожалуйста! Это начнет работать!

...