首先先说说,远程服务和本地服务。
本地服务,在当前工程里的服务,运行在当前进程里的。
远程服务是在另外一个工程的服务,运行在另外进程里的。
代码写起来有什么区别呢
首先先说说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();
}