2012-12-23 10 views
6

私はAIDLを介して他のサービスと通信するサービスを持っています。私は、そのサービスが私のアプリケーションの活動に縛られることを望みます。サービスが2つのバインダー\インターフェースを定義できますか?私は、 "onBind"メソッドをオーバーライドするように、アクティビティと通信するためにメッセンジャーを使用しようとしました。これは、それが取得するインテントに応じて別のバインダを返します(1つは他のサービス用、もう1つはアクティビティ用)。アンドロイドサービスは、通信するための2つのインターフェースを提供できますか?

しかし、サービスから同じバインダを使用しているアクティビティのバインドが解除されると、「myServiceがServiceConnectionをリークしました...元々ここにバインドされていました」というエラーが表示されます。他のサービスと通信する。
サービスが2つのインタフェースを使用できない場合、どのようにアクティビティとそのサービス間の通信を実装できますか?

はAIDLとMessengerは、他のアプリケーション/プロセスとIPCのために使用されている -Liron

答えて

0

、ありがとうございました。 Android API Guideから:

:AIDLを使用すると、異なるアプリケーションからのクライアントがIPCのためにあなたのサービスにアクセスすることを可能にし、あなたのサービスでマルチスレッド処理したい場合にのみ必要です。異なるアプリケーション間で同時にIPCを実行する必要がない場合は、バインダーを実装してインターフェイスを作成するか、IPCを実行したいがマルチスレッドを処理する必要がない場合は、Messengerを使用してインターフェイスを実装する必要があります。それにかかわらず、AIDLを実装する前にBound Servicesを理解していることを確認してください。

アクティビティがサービスと同じプロセスにある場合は、バインダを拡張するだけで済みます。

あなたのサービスは、独自のアプリケーションにプライベートであり、(一般的です)、クライアントと同じプロセスで実行された場合はバインダークラス

を拡張

、あなたはバインダーを拡張することで、あなたの インタフェースを作成する必要がありますonBind()から のインスタンスを返します。クライアントはバインダーを受け取り、 バインダーの 実装またはサービスで利用可能なパブリックメソッドに直接アクセスすることができます。あなたのサービスが自分の アプリケーションのバックグラウンドワーカーにすぎない場合は、これが好ましいテクニック です。この インターフェイスを作成しない唯一の理由は、サービスが他のアプリケーションによって使用されているか、または の別のプロセスで使用されているためです。

バウンドサービスのライフサイクルに関するこのグラフィックは( http://developer.android.com/guide/components/bound-services.html#Lifecycle)あなたが結合しているか/アンバインドを助けるかもしれ

enter image description here

関連する問題