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)
但是,如果警报管理器触发此意图该怎么办?我必须抓住它吗?因为某种程度上程序永远不会重新注册.
首先.提供的重试代码错误!是的,即使谷歌的人也可以发布错误的代码!
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)
(这是一个额外的块,保留所有其他的东西)
你去吧!它将开始工作!
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |