天天看点

安卓进程间通信(ipc)

这几天面试,准备了一下ipc进程间通信,顺带着,总结了一下service和bindservice两种不同开启方式的区别

1.bindService(service, conn, Context.BIND_AUTO_CREATE); 类似支付宝,支付了的软件

2.startservice();这种方式,使用的不多,这种方式开启了一个服务,之后就不去操作他了

这里我们主要说的是ipc进程间通信,也就是两个应用程序之间进行通信

1.先写伪代码

 1.a(客户端),b(服务端).简单的写,在a的oncreat()中进行远程服务器的绑定。(b必须已经开启了). 中间牵扯到一个连接到服务端的一个回调问题。

 2.  开启的bindservice(参数conn)//是服务器连接后的一个回调。之后解绑服务器,需要用到这个conn;

 3.class MyServiceConnection implements ServiceConnection {

@Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             System.out.println("调用远程1111111111服务方法应用程序输出的Log: 服务连接了");
             iRemoteService = Stub.asInterface(service);
         }

         @Override
         public void onServiceDisconnected(ComponentName name) {
             // TODO Auto-generated method stub
             
         }      

这里额service是返回的服务端的ibinder对象的子类

服务端:

因为客户端a,需要调用服务端的方法,那么在ibinder中返回一个服务端内部类的对象引用。在内部类中,引用外部类的方法。当a和b建立连接后,也就是说连接桥的建立成功,那么,服务端会通过

/**
      * IBinder 对象就是传递给ServiceConnection中的对象
      * 传递给 ServiceConnection.onServiceConnected
      */
     @Override
     public IBinder onBind(Intent intent) {
         System.out.println("服务被绑定了11111111");
         return new MyBinder();
     }      

返回一个服务端的内部类对象给a客户端。

注意:客户端和服务端。在俩个进程里面,原则上不可以进行通信,无法拿到。具体的对象。那么我们就需要使用google给我们提供的ipc进程间技术,aidl接口语言定一个需要实现的方法。进入到我们写的interface类中,将后缀名字改为aidl。这样在gen文件夹下简历一个。java的文件,(删除interface中的public关键,aidl不支持这样的关键子)

,我们在生命service的时间,在mainfest.xml文件。定义一个action这样为了以后隐身连接来用的。因为service开启过后,一直存在后台中,这样我们可以通过在客户端中开启一个隐式的意图达到,绑定到服务。

最重要的是,需要a和b 中的aidl定义的接口一直。包名一置。这样就可以实现了。