web-dev-qa-db-ja.com

Javaの「スタブ」および「AIDL」とは何ですか?

質問1:

私はAndroidサービスを勉強しており、次のようなコードをよく見ます:

private ISampleService.Stub sampleServiceIf = new ISampleService.Stub(){}

とは .Stub

質問2:

[〜#〜] aidl [〜#〜] "をチェックしましたが、Javaインターフェースファイルの代わりにそれを使用する必要がある理由を知りたいですか?

32
AmyWuGo

「スタブ」は、リモートインターフェースをローカルインターフェースのように使用できるようにリモートインターフェースを実装するクラスです。データのマーシャリング/アンマーシャリング、およびリモートサービスとの送受信を処理します。 「スタブ」という用語は、他のRPCメソッド(COM、Javaリモーティングなど))でこの機能を説明するために一般的に使用されますが、少し異なることを意味する場合があります。

IDL(インターフェース定義言語)は一般に言語に依存せず、理論的にはC++またはPythonスタブコードから生成できます。Android 1つはJavaベースですただし、その違いは微妙です。1つの違いは、.aidlファイルで使用できるインターフェースは1つだけですが、Javaは、.Javaファイルごとに複数のクラス/インターフェースを許可します。どのタイプがサポートされているかというルールは、Javaインターフェースとはまったく同じではなく、AIDLの代わりに使用することはできません。

33
Nikolay Elenkov

AIDLファイルでは、リモートサービスのメソッドシグネチャを使用してインターフェイスを定義できます。 AIDLパーサーは、インターフェイスからJavaクラスを生成します。これは、2つの異なる目的に使用できます。

  1. Proxyクラスを生成して、クライアントがサービスにアクセスできるようにします。
  2. これはabstractStubクラスを生成します。これは、サービス実装がリモートメソッドの実装を使用して匿名クラスに拡張するために使用できます。

    enter image description here

言い換えると、

  • AIDL Androidプロジェクトがコンパイルされると、Javaクラス_ISampleSevice.Java_が_ISampleSevice.aidl_ファイルに対して生成されます。

  • 抽象スタブクラスとプロキシクラスがあります。

  • リモートサービスはスタブクラスオブジェクトを作成する必要があり、クライアントがbindService()を呼び出したときに同じものがクライアントに返される必要があります。

  • リモートサービスのonBind()は、スタブクラスオブジェクトを返します。

  • クライアントのonServiceConnected()で、ユーザーはリモートサービスで定義されたスタブのプロキシオブジェクトを取得できます(ISampleService.Stub.asInterface()はプロキシクラスを返します)。

  • プロキシオブジェクトを使用して、サービスプロセスでスタブクラス実装のリモートメソッドを呼び出すことができます。

3
Hardian

ちょっとこれをチェックしてください http://developer.Android.com/guide/components/aidl.html 。スタブとAIDLを理解するのに役立ちます。

1
PravinK