我使用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);
但是,如果警报管理器触发此意图该怎么办?我必须抓住它吗?因为某种程度上程序永远不会重新注册。
答案 0 :(得分:5)
首先。提供的重试代码为错误!是的,即使谷歌的人也可以发布错误的代码!
am.set方法(在C2DMBaseReceiver.handleRegistration中)接受自启动之后的时间(以毫秒为单位)。我们正在传递30000,60000,120000等。所有这些值在过去都会很好。我们应该传递的是:
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + backoffTimeMs,
retryPIntent);
这意味着我们正在说下一个意图应该在现在+ backOffTimeMs被解雇。这是已发布代码中的第一个错误。
第二个错误是没有连接到接收
的BroadcastReceivercom.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>
(这是一个额外的块,保留所有其他内容)
你去吧!它将开始工作!