1

Binderクラスを使用してサービスをバインドするには、いくつかの助けが必要です。

私は2つのAPKを持っています。最初のものはサービスを宣言し、2番目のAPKのアクティビティからそれをバインドしたいと思います。

両方のAPKは、同じsharedUserIdと同じandroid:processを使用します。

それらは同じプロセスで実行されているので、IPC通信にAIDLを使用したくありません(私はすでに試していますが、動作していますが、1つのプロセスしか使用していないので使用したくありません)。

サービスを開始/バインドすることはできますが、サービスへの参照を取得できません:

LocalBinder binder = (LocalBinder);
mService = binder.getService();

例外が発生します:

E/AndroidRuntime(6145): java.lang.ClassCastException: 

私の場合、IBinderクラスを拡張してサービスをバインドすることは可能ですか?

ありがとう

4

2 に答える 2

0

私はこれを試したことがありませんが、各.apkが独自のを使用してロードされていると思われClassLoaderます。これは、各.apkからの同じ名前の2つの同一のクラスが、DalvikVMによって完全に異なるクラスと見なされることを意味します。

これを解決するのは不可能だと思います。

したがって、aidlを使用する必要があります。私はあなたが援助するために2つの異議を唱えたと思います。

  • すべてのデータをクラスなどにマーシャリングすることに時間を費やしたくないと思われるかもしれませんParcelable。ただし、前述のように、2つの.apk間でデータをJavaオブジェクトとして直接渡す方法を見つける可能性は低いと思います。同じプロセスで実行している場合でも、選択の余地はありません。
  • おそらくあなたはパフォーマンスについて心配していました。ただし、バインダー呼び出し(aidl呼び出しを含む)は、同じプロセス内にある場合は単なる関数呼び出しになるため、心配する必要はありません。
于 2013-03-01T09:47:35.183 に答える
0

メッセンジャーを使用する: これは、プロセス間通信(IPC)を実行する最も簡単な方法です。メッセンジャーはすべての要求を単一のスレッドにキューイングするため、サービスをスレッドセーフに設計する必要がありません。

インターフェースが異なるプロセス間で機能する必要がある場合(つまり、異なるAPK)、Messengerを使用してサービスのインターフェースを作成できます。このようにして、サービスはさまざまなタイプのメッセージオブジェクトに応答するハンドラーを定義します。このハンドラーは、クライアントとIBinderを共有できるメッセンジャーの基盤であり、クライアントがメッセージオブジェクトを使用してサービスにコマンドを送信できるようにします。さらに、クライアントは独自のメッセンジャーを定義できるため、サービスはメッセージを送り返すことができます。

サービスがリモートプロセスと通信する必要がある場合は、Messengerを使用してサービスのインターフェイスを提供できます。この手法により、AIDLを使用せずにプロセス間通信(IPC)を実行できます。

メッセンジャーの使用方法の概要は次のとおりです。

このサービスは、クライアントからの呼び出しごとにコールバックを受け取るハンドラーを実装します。このサービスは、ハンドラーを使用してメッセンジャーオブジェクト(ハンドラーへの参照)を作成します。メッセンジャーは、サービスがonBind()からクライアントに返すIBinderを作成します。クライアントはIBinderを使用して、メッセンジャー(サービスのハンドラーを参照する)をインスタンス化します。メッセンジャーは、クライアントがメッセージオブジェクトをサービスに送信するために使用します。サービスは、ハンドラーで、具体的には、handleMessage()メソッドで各メッセージを受信します。

このように、クライアントがサービスを呼び出すためのメソッドはありません。代わりに、クライアントは、サービスがハンドラーで受信するメッセージ(メッセージオブジェクト)を配信します。

于 2017-05-05T07:16:43.663 に答える