###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