AIDL是android app进行进程间通信的一种简单方法,本文正对在Android studio下建立AIDL通信遇到的问题以及一些细节做一下介绍。
1,Server的处理
(1)建立AIDL文件,在Android Studio下只要在根目录建aidl文件就会自动在main目录下建一个与java文件相同的包,新建的aidl文件就在这个目录下。
(2)建完aidl文件,rebuild项目,就会自动生成一个和aidl文件名字相同的接口文件。
(3)新建service,service的内部类实现编译生成的接口:
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new MyBinder();
}
class MyBinder extends IMyAidlInterface.Stub{
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
@Override
public String getName(MyParcelable p) throws RemoteException {
return p.getmData() + "";
}
}
}
(4)修改build.gradle文件,添加如下代码:
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java', 'src/main/aidl']
resources.srcDirs = ['src/main/java', 'src/main/aidl']
aidl.srcDirs = ['src/main/aidl']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
}
2,客户端处理
(1)直接将server端的aidl文件复制到客户端,注意保持文件目录相同,以下是截取的server目录截图:
接着是客户端截图
image.png(2)调用远程service
这一步主要是建立Service连接,代码如下:
getActivity().bindService(new Intent("com.test.server"), new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}, Context.BIND_AUTO_CREATE);
获取到Service对象之后,就可以进行远程Service远程调用了。
3,自定义数据类型
AIDL提供的基本数据类型和list,map如果要使用自定义的数据类型则需要进行以下几步:
(1)自定义java类,并且实现Parcelable接口。
(2)在aidl文件夹下,新建一个和自定义类名相同的aidl文件,
package server.test.com.server;
parcelable MyParcelable;
(3)引用这个aidl类型,注意要手动导包,即使在同一个目录下。
package server.test.com.server;
import server.test.com.server.MyParcelable;
// 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.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
String getName(in MyParcelable p);
}
这里要说明一下,接收的数据类型前面要加上in,或者out,或者inout,in表示的是客户端输入的数据,out表示的是服务端输出数据,inout表示即可以输入也可以输出。
(4)复制aidl文件和java文件到客户端相应位置,保持包名相同,然后就可以调用了。
网友评论