1

プッシュ通知を受信するために、GCM を Android アプリと統合しています。すべて正常に動作し、通知を受け取ることができます。問題は、アプリが実行されていないときでもこれらの通知を受信することですが、アプリが実行されているときにのみ受信する必要があります。

だから私は、ブロードキャストレシーバーをプログラムでアプリケーションに登録し、登録を解除すればonDestroy()うまくいくと思いました。
ただし、これは機能しません。登録 ID を取得しようとすると、SERVICE_NOT_AVAILABLE が返されます。

これは動作するマニフェストで宣言されたブロードキャスト レシーバーですが、常に通知を受け取ります。

 <receiver android:name=".service.MyBroadcastReceiver"
                  android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
                <category android:name="com.testgcm"/>
            </intent-filter>
</receiver>

そして、これは私がプログラムで作成する方法ですが、上記のエラーを受け取ります:

receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.google.android.c2dm.intent.RECEIVE");
filter.addCategory("com.testgcm");
registerReceiver(receiver, filter, "com.google.android.c2dm.permission.SEND", null);

私が間違っていることを教えてください。または、アプリが実行されているときにのみ通知を受け取るようにするためのより良い方法はありますか?

4

1 に答える 1

2

これは、プログラムで登録しているという事実とはあまり関係がないことがわかりましたが、実際には登録BroadcastReceiver操作の失敗を表しています。

ドキュメントの内容は次のとおりです。

アプリケーションは、エラー エクストラが SERVICE_NOT_AVAILABLE に設定された com.google.android.c2dm.intent.REGISTRATION インテントを受け取ると、失敗した操作 (登録または登録解除) を再試行する必要があります。

最も単純なケースでは、アプリケーションが register を呼び出すだけで、GCM がアプリケーションの基本的な部分ではない場合、アプリケーションは単純にエラーを無視して、次回の起動時に再度登録を試みることができます。それ以外の場合は、指数バックオフを使用して前の操作を再試行する必要があります。指数バックオフでは、失敗が発生するたびに、再試行する前に以前の時間の 2 倍待機する必要があります。登録 (または登録解除) 操作が同期の場合、単純なループで再試行できます。ただし、これは非同期であるため、保留中のインテントをスケジュールして操作を再試行することをお勧めします。

于 2013-07-23T08:52:34.490 に答える