AIDL(每个程序都在自己的虚拟机中运行的,为了保证数据的安全性,进程间不能直接通信,基于Service的ADIL就像一个通信管道使进程间可以通信)
跨进程如何通讯
1.两个进程无法直接通信
2.通过Android系统底层链接进行通信
基于Service的AIDL
AIDL基本理论
AIDL远程调用案例
AIDL原理简单剖析
Android Interface Definition Language
(android 接口定义语言)AIDL使用耗资源 占用内存不要任意使用
通过IPC机制不同应用程序访问服务才用AIDL
IPC(进程间通信)
AIDL 通过IPC让多个应用程序访问你的服务
并且这个服务要处理多线程才有必要使用AIDL
Binder 只有IPC 没有多线程 多个应用程序
Message 只有IPC 没有多线程
服务端Demo创建
1)创建aidl文件
1.java目录右键下 new->folder->AIDL Folder
2.aidl 右键 aidl 文件 syncgradle
project视图下面就会生成ImInterface 资源文件
这样就可以在MainActivity中使用
两个进程通信要设定好规范:通过什么方法,传入什么参数,返回什么参数
接口定义 首字母每个开始首字母都要大写
interface IMyAidl{
int add(int num1,int num2);//int 返回值 add方法,传入Int类型参数
}
2)实现这个接口
public class IRemoteService extends Service{
public Ibinder onBind(Intent intent){
return null;
}
//当客户端绑定到这个服务,就会返回iBinder,也就得到下面这个方法 实现Stub静态内部类(学会看API)
private IBinder iBiner=new IMyAidl.Stub(){
public int add(int num1,int num2) thrwos RemoteException{
log.d("Tag","收到了远程请求,输入的参数是"+num1+"和"+num2)
return num1+num2;
}
}
}
服务端 三个文件 mainactivity IRemoteSevice实现方法onBind方法 得到Ibinder对象
.aidl 写上规范
3)客户端实现接口 必须一致(同意窗口 new 一个modle)
先新建AIDL 文件夹folder
再生成.aidl接口文件 IMyAidl 名字必须一致
oncreate(){...
initView();
//软件已启动就绑定
bindService();
}
绑定服务
//Android 5.0不允许隐士方式启动服务,必须明文标示那个服务
//显示Intent 绑定服务
选中内容 control+alt+m 封装成新方法
private void bindService(){
Intent intent=new Intent();
intent.setComponent(new Compentname("com.imy.aidl","com.imy.aidl. IRemoteService"));
//包名加类名
bindService(intent,conn,Context.BIND_AUTO_CREATE);
//三个参数 1.intent 2.service connection 3.flag 表示绑定时自动启动service
}
学会使用快捷键 alter+enter(本例中提示conn错误)
选中conn alt+enter 生成这个connection
mainActivity中:
IMyAidl adil;
private ServiceConnection conn=new ServiceConnection(){
//绑定上服务时
public void onServiceConnected(ComponentName name,IBindle service){
//拿到了远程的资源,实质上就是服务端的binder通过该方法获得
aidl=IMyAidl.Stub.asInterface(service);
}
public void onServiceDisConnected(ComponentName name,IBindle service){
//回收资源不至于泄露内存
aidl=null;
}
}}
onClick(){
try{
//调用远程的服务
int res=aidl.add(num1,num2);//服务端获取的那个
mEdit.setTex(res+"");
}catch{
}
}//改成
//APP销毁的时候也要解绑定 必须的避免OOM
void Destroy(){
super.onDestory();
unbindService(conn);
}
也是三个文件
网友评论