1. 程式人生 > >Android程序通訊之AIDL Demo

Android程序通訊之AIDL Demo

###AIDL檔案

package com.test.aidltestservice;//包名,注意ADIL檔案在工程中的存放位置要與包名一致
// Declare any non-default types here with import statements
interface IMyAidlInterface {//介面名
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    String myAidlTest();//提供程序間呼叫的方法
}

注:服務端和客戶端都需要該檔案,並且檔名和存放路徑必須相同

###服務端
建立類繼承Service

public class AIDLRemoteService extends Service {
	public final String TAG = this.getClass().getSimpleName();
	
   /*
   * Service生命週期方法
   */
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");
    }
@Override public void onDestroy() { Log.i(TAG, "onDestroy"); super.onDestroy(); } /* * 建立AIDL服務Binder */ private IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub(){ @Override public String myAidlTest() throws RemoteException {//ADIL檔案中定義的方法名
return "Hello AIDL test"; } }; /* * Binder方法過載 */ @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind"); return mBinder; } @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "onUnbind"); return super.onUnbind(intent); } }

###服務端AndroidManiest.xml

 <service android:name="com.coship.aidltestservice.AIDLRemoteService">
       <intent-filter>
           <action android:name="aidltestservice.AIDLRemoteService"/>
       </intent-filter>
</service>

注:action android:name 才是客戶端繫結時初始化話Intent的名稱,而不是service name

###客戶端

public class ClientMainActivity extends Activity{
	public final String TAG = this.getClass().getSimpleName();
	private IMyAidlInterface mConnectIMyAidlInterface;//通過該例項呼叫AIDL方法
	private final static AIDL_INTENT_NAME= "aidltestservice.AIDLRemoteService";
	    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG,"onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client_main);
        mContext = this;
        bindAidlService();
    }

   @Override
   protected void onResume() {
        Log.i(TAG,"onResume");
        try{
            String string = mConnectIMyAidlInterface.myAidlTest();//呼叫AIDL介面,返回的是"Hello AIDL test"
        }
       catch (RemoteException e){
           Log.w(TAG, "服務呼叫失敗");
        }
   }
    
    private void bindAidlService(){
        Intent intent = new Intent(AIDL_INTENT_NAME);
        boolean ret = bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        Log.i(TAG, "建立AIDL連結是否成功:"+ret);
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder binder){
            mConnectIMyAidlInterface = IMyAidlInterface.Stub.asInterface(binder);
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mConnectIMyAidlInterface = null;
        }
    };
}

注意事項:
1、客戶端與服務端都要包含同一套AIDL檔案,並且路徑相同;
2、服務端AndroidManiest.xml必須定義service和,否則繫結不成功;
3、客戶端繫結Binder的名稱為service的action android:name而不是AIDL的包名或者service name