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オブジェクトを返す).
	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サービスが構成されています.特に、タグの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);
    }