2

サービスを作成し、関数を使用してアクティビティを介してアクセスしていbindServiceますが、アクティビティが終了した後もサービスを実行し続けたいと考えていました。

そのために使用する必要がありますが、以前は、が呼び出されたら(サービス内の)にメッセージを送信する場所でstartService使用bindServiceしていました。ServiceConnectionhandleronServiceConnected

しかし、ハンドラーにメッセージを送信するstartService場所がないため、を使用してメッセージを送信する方法がわかりません。onServiceConnected

注:サービスからウィジェットを更新しているため、アプリケーションを使用していなくても、サービスを実行し続けたいと考えています。

したがって、サービスには2つの役割があります

  1. アクティビティ内のtextviewを更新します
  2. アクティビティが終了すると、サービスはウィジェットを更新します
4

2 に答える 2

4

サービスと通信するには、次の 3 つのオプションがあります。

  • インテントにエクストラを追加して、startService を呼び出します。サービスがすでに実行されている場合でも、複数回呼び出すことができます
  • Messenger を作成し、それを使用してサービスと通信する
  • bindService を使用する

サービスで必ず使用START_STICKYして、アクティビティが終了した後も実行を継続startForeground()し、通知を表示しないと、しばらくして (平均で 30 分から 1 時間) SO によってサービスが強制終了されます。

開始フロー:

  • ClientActivity (CA) はサービスを開始し、CA Messenger アドレスをインテントのエクストラとしてサービスに送信します。
  • サービスの開始時に、サービスの Messenger アドレスを CA に送り返します (CA Messenger アドレスを使用してメッセージを送信します)。
  • 最後に、サービスは START_STICKY を返します。

この両方を使用すると、クライアントとサーバーはお互いの Messenger アドレスを認識し、バインドは必要ありません。

サービスを停止するには:

サービスを停止するには、アクティビティで次を使用します。

stopService(new Intent(ActivityClass.this, ServiceClass.class)); 

再接続:

クライアント アクティビティ (CA) を離れ、アプリの再起動時にサービスに再接続する場合は、次の 2 つのオプションがあります。

- CA から startService を再度呼び出します。これにより、サービス内の が再度呼び出されonStartCommandます。サービスonCreate()がまだ実行されていない場合にのみ、サービスが呼び出されます。上記の開始フローを使用して、Messenger サービスを取得できます。

- サービス Messenger を public および static にすることができますpublic static Messenger mMsgService = null;。そのため、CA が起動すると、サービス メッセンジャーが初期化されている (null でない) かどうかを確認し、それを使用してサービスと通信できます。setvice が停止したら、設定する必要がありますmMsgService = null;

幸運を。

于 2012-10-09T11:41:32.643 に答える
0

サービスにバインドする以外に、サービスと通信する方法はありません。アクティビティでサービスをバインドすることは、サービスがサービスの破棄時にバインド解除される(またはバインド解除される必要がある)ことを意味する必要はありません。unbindServiceメソッドを呼び出さない場合、バインドされたサービスは常に実行されます。したがって、ソリューションはサービスにバインドされ、アクティビティのunbindServiceonDestroyを呼び出さないでください。

于 2012-10-09T10:34:10.593 に答える