C2DM注册重试

时间:2011-03-04 13:01:55

标签: android android-intent broadcast android-c2dm

我使用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 个答案:

答案 0 :(得分:5)

首先。提供的重试代码为错误!是的,即使谷歌的人也可以发布错误的代码!

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>

(这是一个额外的块,保留所有其他内容)

你去吧!它将开始工作!