AIDL是指Android Interface definition language(接口定义语言),主要用于进程间的通信。
创建aidl文件
首先需要在和java同级的目录中建一个aidl文件夹,然后右键new出aidl文件。
image.png新建的aidl文件默认会创建一个方法,告诉我们支持的基础类型有哪些
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);
}
aidl的简单使用
使用基础类型,创建一个方法getName
interface IMyAidlInterface {
String getName(int age);
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}
因为aidl是用于进程间通信的,所以需要把这个aidl拷贝到另一个进程中(可以新建工程),需要保证两个进程中aidl文件的包名一致,不然会报错。
rebuild项目后,会发现自动生成了相应的java接口
image.png
服务端进程创建Service和返回Binder
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
class MyBinder extends IMyAidlInterface.Stub {
@Override
public String getName(int age) throws RemoteException {
return age > 30 ? "老王" : "小王";
}
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString)
throws RemoteException {
}
}
}
在AndroidManifest.xml中注册Service
<service android:name=".MyService">
<intent-filter>
<actaion android:name="com.xfz.aidlapplication.MyService123" />
</intent-filter>
</service>
客户端创建ServiceConnection并绑定服务
首先创建intent,
- 可以使用Component,传入包名和服务类名
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.xfz.aidlapplication", "com.xfz.aidlapplication.MyService"));
- 也可以使用Action和Package
Intent intent = new Intent();
intent.setAction("com.xfz.aidlapplication.MyService123");
intent.setPackage("com.xfz.aidlapplication");
绑定和调用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.xfz.aidlapplication", "com.xfz.aidlapplication.MyService"));
// intent.setAction("com.xfz.aidlapplication.MyService123");
// intent.setPackage("com.xfz.aidlapplication");
bindService(intent, mConnection, Service.BIND_AUTO_CREATE);
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//在服务连接成功后进行调用
IMyAidlInterface mIntentionPlus = IMyAidlInterface.Stub.asInterface(service);
try {
Log.d("xfz", "name = " + mIntentionPlus.getName(35));
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
}
网友评论