AIDL
1 概念
Android Interface Define Language ,安卓接口定义语言,是进程间相互通信的一种。 AIDL支持的数据类型有所有的基本类型(int,long,char,boolean等),String,CharSequence,List,Map,Parcelable(所有实现了Parcelable接口的对象),AIDL(所有的AIDL接口本身也可以在AIDL文件中使用)。2 作用
实现跨进程通信。
3 用法
服务端
服务端首先要创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口即可。
先上一张项目截图:
新建项目后,先写一个AIDL文件
interface IPerson {
void setAge(int age);
void setName(String name);
String display();
}
之后需要同步一下,看到如下文件:
IPersonImpl.java
public class IPersonImpl extends IPerson.Stub {
private int age;
private String name;
@Override
public void setAge(int age) throws RemoteException {
this.age=age;
}
@Override
public void setName(String name) throws RemoteException {
this.name=name;
}
@Override
public String display() throws RemoteException {
return "name="+name+";age="+age;
}
}
public class MyService extends Service {
private IPerson.Stub iPerson=new IPersonImpl();
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return iPerson;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {AIDL服务端
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setAction("com.ljt.aidlserver.MY_SERVICE");
//绑定服务
startService(intent);
}
}
客户端
首先需要需要将.aidl文件的包拷到客户端下(思考:为什么需要这样做,它底层做了些什么?提示参考Binder机制),客户端绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。
先上一张截图:
MainActivity.java
public class MainActivity extends AppCompatActivity {AIDL客户端
private IPerson iPerson;
Button btn;
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
iPerson=null;
}
@Override
synchronized public void onServiceConnected(ComponentName name, IBinder service) {
iPerson=IPerson.Stub.asInterface(service);
System.out.println("iperson---------"+iPerson);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.btn_main);
Intent intent = new Intent("com.ljt.aidlserver.MY_SERVICE");
bindService(intent, conn, Service.BIND_AUTO_CREATE);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
iPerson.setAge(20);
iPerson.setName("码上飞");
String msg = iPerson.display();
// 显示方法调用返回值
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
}catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
}
运行效果