C2DM注册重试

imb*_*ken 2 android broadcast android-intent 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);
Run Code Online (Sandbox Code Playgroud)

但是,如果警报管理器触发此意图该怎么办?我必须抓住它吗?因为某种程度上程序永远不会重新注册.

Var*_*rji 5

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

am.set方法(在C2DMBaseReceiver.handleRegistration中)接受自启动之后的时间(以毫秒为单位).我们正在传递30000,60000,120000等.所有这些值在过去都会很好.我们应该传递的是:

am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + backoffTimeMs,
                        retryPIntent);
Run Code Online (Sandbox Code Playgroud)

这意味着我们说下一个意图应该在now + 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>
Run Code Online (Sandbox Code Playgroud)

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

你去吧!它将开始工作!