2

私は 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);

しかし、アラーム マネージャーがこのインテントを起動した場合はどうすればよいでしょうか? 私はそれをキャッチする必要がありますか?どういうわけか、プログラムは登録を再試行しないためです。

4

1 に答える 1

5

初めに。指定された再試行コードが間違っています。はい、Google の社員でさえ、間違ったコードを公開する可能性があります。

am.set メソッド (C2DMBaseReceiver.handleRegistration 内) は、ブートアップからインテントが起動するまでの時間をミリ秒単位で取得します。30000、60000、120000 などを渡します。これらの値はすべて、過去に問題ありません。渡す必要があるのは次のとおりです。

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

これは、次のインテントを今 + backOffTimeMs で起動する必要があることを意味します。これは公開されたコードの最初のバグです。

2 番目のバグは、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>

(これは追加のブロックです。他のすべてのものはそのままにしておきます)

そして、そこに行きます!稼働開始します!

于 2011-10-05T18:34:41.497 に答える