Android binder之间通信

223 阅读2分钟

android binder之间的通信,简单的理解成客户端和服务器之间的通信,客户端和服务器在各自独立的进程空间里面,进程之间无法直接通信,也就造成客户端发送的消息无法直接发送给服务器,通信之间出现了缺口,binder就充当这个角色,让客户端和服务器连接起来,客户端和服务器都要遵守binder的规范来。

1,客户端 a,客户端要在自己的工程目录下面引入服务器创建的aidl文件,也可手动创建(手动创建的aidl必须和服务器包名路径一致),个人理解就是要在服务器上面去注册,代码和服务器代码一样,person是自定义的数据类型,要在客户端建立服务器包名的下的person类,person类要实现Parcelable接口

b,客户端aidl代码如下,是要和服务器代码要完全一致

package com.wzy.binderclient;
import com.wzy.binderclient.Person;
parcelable Person;

interface IService {
   void showToast(String msg);
   void addPerson(in Person person);
}

c,客户端连接服务器代码 ,调用代码bindService代码,intent的action要设置服务器配置文件中service中添加的action,intent还要设置服务器包名(简单理解成要连接那个服务),代码和图片的关系如下图:

        Intent intent =new Intent("android.intent.action.service");
        intent.setPackage("com.wzy.binderclient");
        bindService(intent, connection, Context.BIND_AUTO_CREATE);

d,客户端向服务器发送简单的数据 ,首先要拿到连接服务器返回的IService代理对象mService对象,然后拿着这个mService对象,如果显示连接成功,就可以拿着这个mService 对象就可以向服务器发送数据了。

发送简单的数据类型比如String类型,直接调用IService.aidl接口中定义好的方法 mService.showToast("这是客户端发送的数据") 如果发送自定义数据类型,直接调用IService.addPerson(person)对象,客户端的代码完成了,下面请看服务器短的代码。

2,服务器 a)简单理解通信协议的制定者,如果客户端要和我通信,就必须按照我的通信协议格式来,才可以连接成功。比如创建的IService.aidl接口协议,创建的Person类,客户端要和我创建的协议名和路径要完全一致,否则通信就会失败。

b)服务器创建的service中要设置exported=true和enabled=true,设置action,如上文,客户端连接服务器时,要和我这里的设置保持一致。

c)服务器开启服务,监听客户端连接请求,监听连接代码如下

d)连接成功之后,查看服务处理客户端传过来的消息,简单打印然后toast出来,调用toast通知的时候,直接toast会抛异常,后果handler处理消息

e)最后看下运行的结果,代码很初级,如有错误之后,请大家指正