2011-03-04 3 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

우선. 제공된 재시도 코드는 입니다. WRONG! 예, Google의 사람들조차도 잘못된 코드를 게시 할 수 있습니다!

am.set 메서드 (C2DMBaseReceiver.handleRegistration)는 의도적으로 실행해야하는 시간 (밀리 초 단위)을 취합니다. 우리는 30000, 60000, 120000 등을 통과하고 있습니다.이 모든 값들은 과거에는 잘 될 것입니다. 무엇을 우리가 통과해야하는 것입니다 : 이것은 우리가 다음 의도가 이제 + backOffTimeMs에서 해고해야 말하는 의미

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

. 이것은 게시 된 코드의 첫 번째 버그입니다.

두 번째 버그는

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에서 인 텐트 {act = com.google.android.c2dm.intent.RETRY flg = 0x4 (extras)}를 방송했습니다 (pid = -1, uid = 10041) 수신자 my.package.name/com.google.android.c2dm.C2DMBroadcastReceiver로 인해 com.google.android.c2dm.permission.SEND가 필요합니다. 필요한 부분을 포함하도록 답변을 확장 할 수 있다면 좋을 것입니다. 이 문제를 해결하여 완전한 답을 제공하십시오. 다시 한 번 감사드립니다. – jamesc