2

私はいくつかの同様の質問を読みました(たとえば、このリンクで)が、私が尋ねている問題は少し異なります。実際、私の場合、サービスはメソッドによって手動で開始されるstartServiceため、結果として、メソッドを使用してサービスを開始することはできませんbindService

  1. MainServiceサービスとMainServiceActivityアクティビティを含むパッケージがあるとします。ファイル「AndroidManifest.xml」では、このアクティビティはアクションMAINとカテゴリで宣言されていますLAUNCHER。このアクティビティは、を介してサービスを構成し、メソッドSharedPreferencesを呼び出してサービスを開始するために使用されますstartService。つまり、通常、ユーザーはを起動し、MainServiceActivityを構成/開始しMainServiceます。
  2. SecondActivity次に、別のパッケージの一部である別のアクティビティ(それを呼びましょう)について考えてみましょう。構成に応じて、サービスはstartActivityメソッドを使用してこのアクティビティを開始するため、この他のアクティビティはとは別のプロセスで実行されますMainService。アクティビティが実行されるとすぐに、サービスに通知する必要があります。
  3. この時点で、MainServiceとの間で通信要求/応答が開始されSecondActivityます。サービスは要求を送信し、アクティビティは応答を送信します。

メッセージングを介した通信は適切かもしれませんが、メソッドMainServiceを介して開始されるため、サービスにバインドするアクティビティからメソッドを呼び出すことはできません。startServicebindService

UtilityServiceそれから私は、同じパッケージの一部である追加のサービス(それを呼びましょう)を利用するというアイデアを思いつきましたMainService:メソッドUtilityServiceを使用して開始することができますbindService。結果として:

  • が実行されるとすぐに、 ;MainServiceへのバインドが実行される場合があります。UtilityService
  • MainService外部アクティビティ(上記など)を起動するとSecondActivity、このアクティビティはにバインドされUtilityServiceます。

このようにして、MainServiceとの両方SecondActivityがに接続されUtilityService、後者は通信の仲介役として機能します。

このアイデアに代わるものはありますか?

4

2 に答える 2

4

実際、私の場合、サービスはstartServiceメソッドによって手動で開始されるため、bindServiceメソッドを使用してサービスを開始することはできません。

必要に応じて、サービスをバインドして開始することができます。少し珍しいですが、できます。

このアイデアに代わるものはありますか?

バインディングは、サービスがアクティビティと通信できることとは特に関係ありません。バインディングを介してある種のコールバックまたはリスナーオブジェクトを使用することは可能ですが、それだけではありません。

あなたはできる:

  • サービスにブロードキャストを送信してもらいIntent、アクティビティでピックアップします

  • アクティビティにPendingIntent(たとえば、を介してcreatePendingResult())を送信させ、をIntent介して送信されたコマンドの追加startService()機能を使用して、サービスがアクティビティに情報を送り返すために使用します(または、ブロードキャストなど、アクティビティが希望する場所に送信します)。

  • を介して送信されたコマンドMessengerの追加機能で、ハンドラーに関連付けられたアクティビティをサービスに渡して、サービスが情報をアクティビティに送り返すために使用するようにします。IntentstartService()

これらはすべて、プロセス間およびプロセス内で完全に機能します。

于 2012-04-27T23:06:32.163 に答える
1

Androidインターフェース定義言語(AIDL)を使用できます。

ここで使いやすいガイドを見つけることができます

于 2012-04-27T22:55:04.457 に答える