3

実行中のプロセスでサービスがうまく機能しています。メイン アクティビティが表示されていない場合でも、特定のブロードキャスト レシーバーを制御します。また、いくつかのパラメータをチェックするために、一定の間隔で独自に起動します。ブロードキャスト レシーバーが存在しないことを検出すると、サービスが登録されるまでサービスを完全に停止するか、一定の間隔でサービスを再起動できます。その間、サービスは START_NOT_STICKY モードで実行されます。

ただし、サービスに接続してレシーバーを登録すると、その実行状態を START_NOT_STICKY から START_STICKY に変更する方法はありますか? それとも、受信側で isRegistered フラグを使用し、サービスを停止して再起動し、onStartCommand 内でその値を確認するだけでよいのでしょうか? これは使用するのに適したパターンですか、それとももっと良いパターンがありますか?

これを行う主な理由は、アプリが必要としないプロセスをバックグラウンドで実行しないようにするためです。

4

1 に答える 1

0

android dev website Servicesから、 START_STICKY は、コマンドの実行が完了した後にサービスが停止することを意味し、 START_NOT_STICKY はコマンドの実行後に終了します。
あなたの説明から、サービスを実行していて、ブロードキャストレシーバーを追加していると言い続けていますか? ブロードキャスト レシーバは、実際には、他のサービスに関係なく、外部要求を受信するために使用されます。ブロードキャスト レシーバーは、アプリが外部要求を受信する最初の接点となり、必要なコマンドを実行するサービスを開始する役割を果たします。コマンドを定期的に実行するために必要なサービスに関しては、上記のサービスフラグの定義に基づいて、必要に応じて開始および終了する必要があります。

GCM (Google クラウド メッセージング) のフローの例。

  1. クラウド サーバーは、登録済みのデバイスにメッセージを送信します。
  2. 登録済みのデバイスで Google Play サービスを介して、登録済みのアプリのブロードキャスト レシーバーにインテントが送信されます。
  3. ブロードキャスト レシーバーはインテントを受信し、処理に必要な追加コマンドを実行するサービスに渡します (通知を表示する IE など)。
于 2013-10-09T18:19:01.607 に答える