9

AIDL を介して他のサービスと通信するサービスがあります。そのサービスをアプリケーションのアクティビティにバインドしたいと考えています。サービスは 2 つのバインダー\インターフェイスを定義できますか? アクティビティとの通信にメッセンジャーを使用し、「onBind」メソッドをオーバーライドして、取得する意図に応じて別のバインダーを返すようにしました (1 つは他のサービス用、もう 1 つはアクティビティ用)。

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

ありがとう -ライロン

4

2 に答える 2

0

AIDLとMessengerは、他のアプリケーション/プロセスとのIPCに使用されます。Android APIガイドから:

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

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

Binderクラスの拡張

サービスが独自のアプリケーション専用であり、クライアントと同じプロセスで実行される場合(これは一般的です)、Binderクラスを拡張し、onBind()からそのインスタンスを返すことによってインターフェイスを作成する必要があります。クライアントはBinderを受け取り、それを使用して、Binder実装またはサービスのいずれかで使用可能なパブリックメソッドに直接アクセスできます。これは、サービスが単に独自のアプリケーションのバックグラウンドワーカーである場合に推奨される手法です。この方法でインターフェースを作成しない唯一の理由は、サービスが他のアプリケーションによって、または別々のプロセス間で使用されているためです。

バインドされたサービスのライフサイクルに関するこの図は、バインド/バインド解除の方法に役立つ場合があります(http://developer.android.com/guide/components/bound-services.html#Lifecycle):

ここに画像の説明を入力してください

于 2013-01-30T01:27:18.210 に答える