20

Android プロジェクトでプッシュ通知 (GCM) を使用しています。

GCM のチュートリアルに従って、ブロードキャスト レシーバーを実装し、.NET に登録しましたAndroidManifest.xml

この種のブロードキャスト レシーバーは、アプリが閉じられている場合でもメッセージを受信する必要があります (アプリがバックグラウンドにある場合だけでなく、強制停止された場合でも)。

しかし、期待どおりには機能しません。onReceive()アプリが閉じている場合、メソッドは呼び出されていません。放送受信機に関する私の理解は正しいようで、問題は GCM についての私の期待にあります。

考えられる理由の 1 つは、アプリが閉じられている場合、Google サーバーがデバイスに通知を送信していないことです。onReceive()では、アプリが実行中またはバックグラウンドで (閉じていない) 場合にのみ、アプリがメッセージを受信できる (そしてメソッドがブロードキャスト レシーバーで呼び出される) のは正しいでしょうか?

前もって感謝します。

4

3 に答える 3

16

この種のブロードキャストレシーバーは、アプリが閉じている場合でも(アプリがバックグラウンドにある場合だけでなく、アプリが強制的に停止されている場合でも)メッセージを受信する必要があります。

ユーザーが[設定]からアプリを強制的に停止した場合、コンポーネントの1つを手動で実行するまで、コードが再度実行されることはありません。通常、ユーザーは手動でアクティビティを起動します(Android 3.1以降)。したがって、ユーザーが[設定]からアプリを強制的に停止した場合、新しいデバイス/エミュレーターでGCMメッセージを受信することはありません。

それで、私のアプリがメッセージを受信できる(そしてonReceive()メソッドがブロードキャストレシーバーで呼び出される)のは、アプリが実行中またはバックグラウンド(ただし閉じられていない)の場合のみであるというのは正しいですか?

アプリケーションの観点から、Androidには「クローズド」の概念はありません。「クローズ」とは、「実行中のプロセスがなく、最後のプロセスが正常に終了した」ことを意味する場合、はい、GCMメッセージおよびその他のブロードキャストを受信する必要があります。しかし、繰り返しになりますが、強制停止は「正常に終了」しません。

于 2012-08-22T12:57:26.400 に答える
3

この android-gcm スレッドのFrancesco Nerieri によると:

したがって、アプリを強制停止した場合、ICS の意図した動作は、アプリがメッセージを受信しないようにすることです。JB では、これは GCM もアプリを登録解除することを意味します。これは残念な動作であり、これを変更するために取り組んでいます (JB の登録解除部分)。

于 2012-08-27T21:16:23.457 に答える
2

ドキュメントには次のように書かれています:

Android デバイス上の Android アプリケーションは、メッセージを受信するために実行されている必要はありません。アプリケーションが適切なブロードキャスト レシーバーと権限でセットアップされている限り、メッセージが到着すると、システムはインテント ブロードキャストを介して Android アプリケーションをウェイクアップします。

ブロードキャスト レシーバの実装と権限を確認してください。

于 2012-08-22T12:49:16.500 に答える