android - C2DM注册重试

标签 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);

但是如果警报管理器触发此 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/

相关文章:

android - com.android.support :biometric:28. 0.0-alpha03 无法解析

php - 我正在尝试使用 MAMP 从 mysql 检索数据

Android:使用 Intent 共享纯文本(到所有消息传递应用程序)

linux - 所有接口(interface)上的 UDP 广播

java - 从 firebase 检索图像时出错

java - 将数据从 Activity 传递到选项卡式布局 fragment ?

android - 获取错误构造函数 Intent(new View.OnClickListener(){}, Class<NumberBoardActivity>) 在 android 应用程序代码 : 中未定义

node.js - 无法使用 Node.js 在 Mac OSX 上发送 UDP 广播

android - AudioSource.VOICE_CALL 不适用于 android 4.0 但适用于 android 2.3

java - 带键的 Android 值列表