aidl
2967 ワード
AIDLとは
AIDL:Android Interface Definition Language、すなわちAndroidインタフェース定義言語.
Androidシステムのプロセス間では
共有メモリであるため、異なるプロセス間でデータ通信を行ういくつかのメカニズムを提供する必要がある.
Androidシステムは、他のアプリケーションでも本アプリケーションが提供するサービスにアクセスできるように
リモートプロシージャ呼び出し(Remote Procedure Call,RPC)方式で実現される.他の多くのRPCベースのソリューションと同様に、Androidは、サービスのインタフェースを公開するためにインタフェース定義言語(Interface Definition Language,IDL)を使用します.4つのAndroidアプリケーションコンポーネントのうち3つ(Activity、BroadcastReceiver、ContentProvider)がプロセス間でアクセスできることを知っています.もう1つのAndroidアプリケーションコンポーネントServiceも同様です.したがって,このようなプロセス間アクセス可能なサービスをAIDL(Android Interface Definition Language)サービスと呼ぶことができる.
AIDLステップを確立する:
AIDLサービスの確立は、通常のサービスの確立よりも複雑であり、具体的な手順は以下の通りである.
(1)Eclipse AndroidエンジニアリングのJavaパッケージディレクトリにaidlという拡張ファイルを作成する.このファイルの構文はJavaコードに似ていますが、少し異なります.
(2)aidlファイルの内容が正しい場合、ADTはJavaインタフェースファイル(*.java)を自動的に生成します.
(3)サービスクラス(サービスのサブクラスを確立し,onBindメソッドでaidlオブジェクトを返す).
(4)aidlファイルから生成されるJavaインタフェースを実現する.
(5)AndroidManifest.xmlファイルにAIDLサービスが構成されています.特に、タグのandroid:nameのプロパティ値は、クライアントがサービスを参照するID、すなわちIntentクラスのパラメータ値であることに注意してください.
ICCApiは、サービス側aidlファイルから生成する.JAvaファイル、以下はクライアント呼び出しです.
private void bindService(final Context context) {
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
//TODO Auto-generated method stub
mRcsService = null;
context.bindService(new Intent("com.android.cc.service"), mServiceConnection, Context.BIND_AUTO_CREATE);
Log.e(LOG_TAG,"liuqiang8==>onServiceDisconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(LOG_TAG,"liuqiang8==>onServiceConnected OK");
mRcsService = ICCApi.Stub.asInterface(service);
}
};
context.bindService(new Intent("com.android.cc.service"), mServiceConnection, Context.BIND_AUTO_CREATE);
}
AIDL:Android Interface Definition Language、すなわちAndroidインタフェース定義言語.
Androidシステムのプロセス間では
共有メモリであるため、異なるプロセス間でデータ通信を行ういくつかのメカニズムを提供する必要がある.
Androidシステムは、他のアプリケーションでも本アプリケーションが提供するサービスにアクセスできるように
リモートプロシージャ呼び出し(Remote Procedure Call,RPC)方式で実現される.他の多くのRPCベースのソリューションと同様に、Androidは、サービスのインタフェースを公開するためにインタフェース定義言語(Interface Definition Language,IDL)を使用します.4つのAndroidアプリケーションコンポーネントのうち3つ(Activity、BroadcastReceiver、ContentProvider)がプロセス間でアクセスできることを知っています.もう1つのAndroidアプリケーションコンポーネントServiceも同様です.したがって,このようなプロセス間アクセス可能なサービスをAIDL(Android Interface Definition Language)サービスと呼ぶことができる.
AIDLステップを確立する:
AIDLサービスの確立は、通常のサービスの確立よりも複雑であり、具体的な手順は以下の通りである.
(1)Eclipse AndroidエンジニアリングのJavaパッケージディレクトリにaidlという拡張ファイルを作成する.このファイルの構文はJavaコードに似ていますが、少し異なります.
(2)aidlファイルの内容が正しい場合、ADTはJavaインタフェースファイル(*.java)を自動的に生成します.
(3)サービスクラス(サービスのサブクラスを確立し,onBindメソッドでaidlオブジェクトを返す).
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return ICCApiImpl.get();
}
public class ICCApiImpl extends ICCApi.Stub{
private final String TAG = "ICCApiImpl";
private static ICCApiImpl mCCService;
public static ICCApiImpl get() {
if(null == mCCService) {
mCCService = new ICCApiImpl();
}
return mCCService;
}
private ICCApiImpl() {
}
......................
}
(4)aidlファイルから生成されるJavaインタフェースを実現する.
(5)AndroidManifest.xmlファイルにAIDLサービスが構成されています.特に、
ICCApiは、サービス側aidlファイルから生成する.JAvaファイル、以下はクライアント呼び出しです.
private void bindService(final Context context) {
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
//TODO Auto-generated method stub
mRcsService = null;
context.bindService(new Intent("com.android.cc.service"), mServiceConnection, Context.BIND_AUTO_CREATE);
Log.e(LOG_TAG,"liuqiang8==>onServiceDisconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(LOG_TAG,"liuqiang8==>onServiceConnected OK");
mRcsService = ICCApi.Stub.asInterface(service);
}
};
context.bindService(new Intent("com.android.cc.service"), mServiceConnection, Context.BIND_AUTO_CREATE);
}