2011-03-04 114 views
2

我使用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); 

但是,如果警報管理器觸發此意圖該怎麼辦?我必須抓住它嗎?因爲不知何故程序從未重新註冊。

回答

5

首先。提供的重試代碼是錯誤!是的,即使谷歌的人可以發佈錯誤的代碼!

am.set方法(在C2DMBaseReceiver.handleRegistration中)接受啓動後的時間,以毫秒爲單位應該觸發意圖。我們通過了30000,60000,120000等等。所有這些值在過去都會很好。我們應該傳遞的是:

am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + backoffTimeMs, 
         retryPIntent); 

這意味着我們要說的下一個目標應該在現在+ backOffTimeMs被解僱。這是已發佈代碼中的第一個錯誤。

第二個錯誤是,沒有任何廣播接收器被接線以接收

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> 

(這是一個額外的塊,保留所有其他事情是)

而且你去那裏!它將開始工作!

+0

感謝您的回答。它幫助了我很多,但我得到一個錯誤Permission Denial:從my.package.name(pid = -1,廣播意圖){act = com.google.android.c2dm.intent.RETRY flg = 0x4(有額外) uid = 10041)需要com.google.android.c2dm.permission.SEND,因爲接收者my.package.name/com.google.android.c2dm.C2DMBroadcastReceiver - 如果您可以擴展您的答案以包含所需內容爲解決這個問題提供一個完整的答案。再次感謝 – jamesc 2011-10-13 16:01:19