web-dev-qa-db-ja.com

Android GCM(プッシュ通知):アプリケーションが停止した場合、デバイスは通知を受信しません

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

GCMチュートリアルによると、私は放送受信機を実装し、それを_AndroidManifest.xml_に登録しました。

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

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

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

前もって感謝します。

20
tundundun

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

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

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

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

16
CommonsWare

フランチェスコ・ネリエリによると このAndroid-gcmスレッド

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

3
Evan

documentation では、

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

ブロードキャストレシーバーの実装と権限を確認します。

2