2

我正在使用 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);

但是如果警报管理器触发了这个意图怎么办?我必须抓住它吗?因为不知何故,该程序永远不会重试注册。

4

1 回答 1

5

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

am.set 方法(在 C2DMBaseReceiver.handleRegistration 中)以毫秒为单位记录意图应该触发的时间。我们正在传递 30000、60000、120000 等。所有这些值在过去都会很好。我们应该传入的是:

am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + backoffTimeMs,
                        retryPIntent);

这意味着我们说下一个意图应该在 now + backOffTimeMs 触发。这是已发布代码中的第一个错误。

第二个错误是没有连接到接收广播接收器

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>

(这是一个附加块,保留所有其他内容)

你去吧!它将开始工作!

于 2011-10-05T18:34:41.497 回答