AIDL的学习

来源:互联网 发布:数据关联 编辑:程序博客网 时间:2024/05/16 00:26

首先先说说,远程服务和本地服务。

本地服务,在当前工程里的服务,运行在当前进程里的。

远程服务是在另外一个工程的服务,运行在另外进程里的。


代码写起来有什么区别呢

首先先说说IPC

inter process communication 进程间通讯

如何理解:操作系统把进程创建出来,实际划分一份独立内存空间,那么每个进程都用独立的内存空间,有些特殊的应用场景,需要进程通讯,那如何通讯呢

操作系统进程间通讯:开辟一块公共的内存空间 信号量(如boolean)、 消息队列(队列)、 消息邮箱(比较复杂数据) 、管道(进程1的产物都放到这里,进程2读取出来)

进程间通讯的原理就是两进程访问一块公共内存空间。

Linux设备外设比如说内存、硬盘都是以文件来表示的

binder其实就是一块内存,为获取这块内存,就开发了一个驱动程序

现在就知道进程间通讯就是一个进程通过binder驱动把数据写到这块内存里,另外一个进程把数据读取出来。


具体代码实现,需要aidl,android interface definition language:

1、创建服务接口Iservice

2、修改Iservice,.java修改为.aidl文件 去掉public 因为通用,目的是不同应用程序可以访问,没有修饰符 自动生成服务接口在gen中

3、继承Iservie.Stub ,MyBinder extends Iservice.Stub

4、强制类型转换Iservice.Stub.asinterface(bindr) ,调用程序拷贝aidl并包一致,bindServie 传实现serviceconnection  在实现方法serviceconnected中把Ibinder包装为Iservice.Stub.asinterface();

adil:

package com.tan.remote;

 interface IService {
     void callMethodInService();
}


public class RemoteService implements Service{

private class MyBinder extents IService.Stub{

   publc void callMethodINService(){

           system.out.println("call");

   }

}

   onBinder(){

      return new MyBinder();

   }

}

 

调用程序:

bindSevice(intent,new MyServiceConnection(),BINDER_AUTO_CREATE);

ISevice iService;

MyServiceConnection implements ServiceConnection{

       serviceConnect(Binder service){

           iService =  ISevice.Stub.asInterface(service);

       }

}

onClicke(){

   iService.callMethodINService();

}



0 0
原创粉丝点击