0

苦労しているプログラマーの仲間、

c2dm に関するすべてのドキュメントを参照しましたが、まだアドバイスを求めています。Google サーバーがインテントをデバイスにプッシュするときに作成されたインテントをリッスンするために、アプリケーション内にサービスを実装する必要がありますか?

http://android-developers.blogspot.com/2010/05/android-cloud-to-device-messaging.html

https://developers.google.com/android/c2d/

ドキュメントには、アプリ マニフェストに正しいインテント フィルターとアクセス許可を設定することで、インテントを受信したときにアプリが起動することが記載されています。しかし、アプリがメモリに読み込まれていないのに、どうしてそれが可能なのでしょうか? OS はどこに行くべきかをどのように認識していますか?

通知を受信したときにアプリを起動する、これらのアクセス許可を持つバックグラウンド サービスが必要なように思えます。

誰でもこのアイデアについて洞察を持っていますか?

おそらく、c2dm を使用してバックグラウンド サービスを実装した人

または不要であることがわかりました。

4

2 に答える 2

2

インテント フィルターでは、アプリケーションやサービスを開始する必要はありません。インテント フィルターを登録したイベントが発生したことを OS が認識すると、マニフェストに示されているように、インテント フィルターがアタッチされているインテントを起動します。

于 2012-06-12T14:21:49.880 に答える
0

通常、サービスは必要ありません。メッセージに対してどのような反応が必要かによって異なります。アクティビティを開始したい場合は、C2DM メッセージ受信者から直接行ってください。

ところで、C2DM インテントはサービス インテントではありません。それらは受信者の意図です。サービスはそれらをキャッチしたくてもできません。API レベルでは、インテント自体を起動することはできstartActivity()ませstart/bindService()sendBroadcast()。呼び出された API に応じて、システムはインテントをアクティビティ、サービス、またはレシーバーと照合します。

C2DMを実装しました。私の場合、サービスはありますが、それは、アプリでの C2DM メッセージへの反応が、UI のない HTTP 要求であり、時間がかかる可能性があるためです。これは、物事の壮大な計画ではかなり一般的なパターンのようです。C2DM は単なるトリガーであり、新しいデータがバックエンドで待機していることをアプリに通知するだけです。このシナリオでは、サービスは、バックエンドに前述の新しいデータを静かにクエリし、それらを処理します。それが私の場合です。しかし、そうである必要はありません。

レシーバー オブジェクトは一時的なものであるため、レシーバーだけでは HTTP の適切な手段ではありません。インテントが配信されると、Android はレシーバーが完了したと見なし、それを破棄します。その後、アプリのプロセスには実行中のオブジェクトがなくなり、いつでもシャットダウンされる可能性があります。一方、サービスは、開始されると、明示的に実行される (stopService()が呼び出される) まで実行されます。これは、アプリが何かを実行していることを Android に伝えます。終了しないでください。実行中のサービスは、メモリ不足の状態の場合にアプリがシャットダウンされないことを確実に保証するものではありませんが、何もないよりはましです。

技術的に言えば、ブロードキャスト レシーバーだけが実行されている場合でも、アプリは実行されています。C2DM メッセージが到着すると、Android はアプリ (メインのアクティビティではなくプロセス) を開始します。UIをフラッシュしない限り、ユーザーはわかりません。アプリの他のどのコンポーネントをレシーバーから呼び出すかは、ユーザー次第です。

于 2012-06-12T14:36:07.563 に答える