Android程序通訊之AIDL Demo
阿新 • • 發佈:2018-11-28
###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