**最近我学习到安卓AIDL这篇文章,我又翻阅大佬的一些文章,整合我自己的了解来简单详解这篇文章。
AIDL简介
AIDL是 Android Interface definition language的缩写,我们从中可以看出有Interface,我们才知道AIDL是安卓接口定义语言,可以实现安卓设备中进程之间的通信,也可以用于单个service与多个程序之间进行跨进程通讯,从而实现多个应用使用单个service。
官方表达是:AIDL可以简化进程间数据格式转换和数据交换的代码,它允许在不同进程的调用者和Service之间相互传递数据,其属于轻量级的进程通信机制。
注意:
AIDL定义接口的源代码必须以.aidl结尾。
AIDL接口中用到的数据类型,除了基本类型、String、List、Map和CharSequence外,其他类均需要导入所在包,即使它们在同一个包中也需要导入包。
AIDL
优点:通讯速度快,支持实时通讯,支持一对多并发通讯,支持远程过程调用,系统底层直接共享内存,性能稳定,效率高。
缺点:使用复杂,需要创建AIDL文件,需要处理好线程同步问题。
话不多说,直接上案例:
这样直接创建安卓自带的AIDL,创建一个名为IMyAidlInterface的AIDL。
这是安卓会自动创建如下所示:
然后在IMyAidlInterface编写如下代码:
interface IMyAidlInterface {
String getString();
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}
然后创建一个名为MyService的服务,具体如何创建我之前讲过
链接: https://blog.csdn.net/jzdcuccess/article/details/105654145如果想看如何创建的可以点击连接。
MyService中的代码如下:
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
class MyBind extends IMyAidlInterface.Stub{
public String getString() {
String string="这就是所使用AIDL返回的结果";
return string;
}
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyBind();
}
}
之前绑定服务创建的MyBind是实现IBinder继承字Binder而现在是继承IMyAidlInterface.Stub。Stub是IMyAidlInterface中的一个静态抽象类,继承自Binder并实现IMyAidlInterface接口,其继承了android.os.Binder、
实现IaidlData接口故,我们实际需要实现的是Stub抽象类。
在java中编写如下代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bind_service=(Button)findViewById(R.id.bind_service);
Button unbind_service=(Button)findViewById(R.id.unbind_service);
bind_service.setOnClickListener(this);
unbind_service.setOnClickListener(this);
}
public ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMyAidlInterface myAidlInterface=IMyAidlInterface.Stub.asInterface(service);
try {
String str=myAidlInterface.getString();
Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bind_service:
Intent intent=new Intent();
intent.setAction("com.example.aidl2.service");
intent.setPackage("com.example.aidl2");
bindService(intent,connection,BIND_AUTO_CREATE);
break;
case R.id.unbind_service:
unbindService(connection);
break;
default:
break;
}
}
}
其它的和绑定服务一样,但是有一点不知道你们看出来了吗? intent.setPackage(“com.example.aidl2”);为什么要加入这一行代码呢?
setPackage()表示设置包名。
在AIDL中必须要指明包名,包名必须和java目录下的包名一致。
路径必须一致.如果你的实体类放在com.example.aidl2下,在aidl下也得新建的aidl放在此目录下.不然类无法找到,编译不通过.
最后别忘了在AndroidManifest.xml中配置:
一个简单的运用AIDL的案例就写完了。
如何错误,请斧正。