我正在使用 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);
但是如果警报管理器触发此 Intent 该怎么办?我必须捕获它吗?因为不知何故,程序永远不会重试注册。
最佳答案
首先。提供的重试代码错误!是的,即使是谷歌的人也可能发布错误的代码!
am.set 方法(在 C2DMBaseReceiver.handleRegistration 中)获取启动后 Intent 应触发的时间(以毫秒为单位)。我们传入 30000、60000、120000 等。所有这些值在过去都会很好。我们应该传入的是:
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + backoffTimeMs,
retryPIntent);
这意味着我们说下一个 Intent 应该在 now + backOffTimeMs 时触发。这是已发布代码中的第一个错误。
第二个错误是没有连接广播接收器来接收
com.google.android.c2dm.intent.RETRY
Intent !
因此,我们在 list 文件中添加了以下内容:
<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>
(这是一个附加 block ,保留所有其他内容不变)
就这样吧!它将开始工作!
关于android - C2DM注册重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5194027/