android中的AIDL
2016-05-21 17:21
537 查看
1.AIDL(接口定义语言)
不同进程之间进行通信,访问服务中的方法服务端:
1)声明一个接口,将其后缀名改为aidl,不用声明为public类型,它默认就是public,若为私有,怎么能实现不同进程之前通信
interface SInterface {
void CC();
}
2)在Service类中定义类SS并继承Binder,实现SInterface接口
class SS extends Binder implements SInterface{
@Override
public void CC() {
put();
}
@Override
public IBinder asBinder() {
// TODO Auto-generated method stub
return null;
}
}
注意:此时接口SInterface被改为后缀名为aidl,按理说应该不存在此接口了,但是去查看gen文件夹下的目录,会发现此时存在一个接口SInterface,这是我们去查看SInterface的源码会发现有一个类已经代替我们实现了继承Binder和SInterface接口了,这个类是Stub,所以我们只需继承Stub即可
class SS extends Stub{@Override
public void CC() {
put();
}
}
上述代码简介明了
在onBinder()方法中返回SS实例
客户端:
1)复制服务端的aidl文件到客户端(相同包名)
2)用binderService启动服务bindService(intent, conn, BIND_AUTO_CREATE);
conn的实现:
class Conn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
si=Stub.asInterface(arg1);
}
@Override
public void onServiceDisconnected(ComponentName arg0)
}
}
依然在gen目录下有SInterface接口,Stub同时继承了Binder和实现了SInterface接口,所以用Stub来接收传递回来的接口实例,用此实例即可访问服务中的方法
2.Binder连接池
当多个业务模块需要通信时,需要创建多个Service,Service本身是一种资源,Service过多会使程序看起来很重量级,因此可以将所有的AIDL放在同一个Service中去管理,每个业务模块创建自己的AIDL接口并实现此接口,各个模块之间是不能有耦合的,所有的实现细节要单独开来然后向服务端提供自己的唯一标示和其对应的Binder对象。对于服务端来说,只需要一个queryBinder接口,每个接口能根据模块特征返回相应的Binder对象,不同的模块拿到Binder对象后就可以进行远程方法调用相关文章推荐
- Mac、Windows下Android Studio快捷键的使用
- 给 Android 开发者的 RxJava 详解
- ViewHolder重用机制 RecyclerView+CardView 优化
- android反编译工具Apktool安装与使用
- 给 Android 开发者的 RxJava 详解
- android模拟器无法使用camera拍照
- Android SDK 在线更新镜像服务器资源
- Android使用 DrawerLayout实现侧滑
- Android自定义ViewPager指示器
- android studio <item/>标签下不能使用showAsAction属性
- Android studio 使用JitPack发布library到Github开源库
- 仿网易云音乐Android端歌手资料页面的实现
- android调试输出log打印信息到本地文件
- 【Android学习笔记】Android中View的事件分发机制
- android基础之依赖注入
- android进程间通信--Binder
- Android深入浅出自定义控件(二)
- Retrofit – Java(Android) 的REST 接口封装类库
- android中各种只读的小文件放置位置
- 【转】android出现注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作。 注