Обработка отката при реализации C2DM в Android - PullRequest
0 голосов
/ 06 октября 2011

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

Ниже приведены два намерения, которые я видел в одном из кодов. Но в случае сбоя регистрации повторная попытка фактически никогда не происходит, и я не вижу сгенерированного идентификатора регистрации.

com.google.android.c2dm.intent.REGISTER com.google.android.c2dm.intent.RETRY

http://www.vogella.de/articles/AndroidCloudToDeviceMessaging/article.html. Это код, который используется в приложении.

Пожалуйста, посоветуйте, как нам нужно справиться со спиной.

1 Ответ

0 голосов
/ 14 октября 2011

Вам нужно установить будильник, чтобы повторить регистрацию через некоторое время. Вам нужно добавить фильтр намерений RETRY к объявлению получателя в manifest.html, и код тревоги может выглядеть примерно так

    if ("SERVICE_NOT_AVAILABLE".equals(error)) {
        long backoffTimeMs = C2DMessaging.getBackoff(context);

        Log.d(TAG, "Scheduling registration retry, backoff = " + backoffTimeMs);
        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, SystemClock.elapsedRealtime() + backoffTimeMs,
                retryPIntent);

        // Next retry should wait longer.
        backoffTimeMs *= 2;
        C2DMessaging.setBackoff(context, backoffTimeMs);
    } 

C2DMessaging - это класс из приложения Jumpnote, который можно найти здесь http://code.google.com/p/jumpnote/source/checkout

ОБНОВЛЕНИЕ

Убедитесь, что разрешение RETRY установлено в вашем файле манифестакак предложено в моем ответе на ваш комментарий.Мой манифест выглядит примерно так

    <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <!-- Receive the actual message -->
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="my.package.name" />
        </intent-filter>
        <!-- Receive the registration id -->
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="my.package.name" />
        </intent-filter>
    </receiver>
    <receiver android:name="com.google.android.c2dm.C2DMBroadcastReceiver">
        <intent-filter>
         <action android:name="com.google.android.c2dm.intent.RETRY"/>
         <category android:name="io.modem" />
    </intent-filter>
    </receiver>

Кроме того, это легко проверить на эмуляторе. Просто отключите компьютер от Интернета, и вы получите сообщения о повторных попытках обслуживания, а исключения недоступны, пока вы не подключитесь кИнтернет

...