AIDL ,Android Interface definition language的缩写,就是经常讲的进程间通信。话就不说太多,直接代码搞起,这里我们创建两个module,都为应用类型的模块,一个客户端应用A,一个作为提供服务的服务端应用B(也是客户端),我们这里写一个简单的计算服务在服务端,然后A调用B的服务实现计算。 我们先创建B模块: 看到我圈中的地方,我们在main下跟java平级的地方创建一个aidl的文件夹,接着在aidl下创建跟java下一样的包路径,如下图
接着在aidl包下创建一个后缀名为aidl的文件,命名为IMyAidlInterface.aidl,我们可以使用as直接创建aidl格式的文件, 打开自动生成的文件
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
int add(int num1,int num2);
}
这是一个接口文件,其中basicTypes是自动生成的方法,在这里我们添加了一个add的方法。 现在我们准备工作做好了,我们来创建A模块,如下图,
这张图片是不是有点熟悉,跟上面的一样?细心的同学应该会发现,这圈中的包名是不一样的,这里aidl的文件夹是在我们B模块中直接拷贝过来的。我们调用A端的服务实际上是通过接口调用。 这个时候我们Make project,编译一下工程, 在build文件夹generated -source-aidl-debug下会生成一个我们定义的文件,虽然名称一样,但是打开内容是不一样的,有兴趣的同学可以去读这个文件,还是比较好理解的,这里就不多解释。 现在我们回到B模块,编写我们要提供的服务。 我们创建一个Service,如下图
这个很简单,就创建一个IBinder对象,在onBind中返回,这个IBinder最后是给A端绑定服务调用add使用的。这里我们add方法就做简单的逻辑处理,将传递过来的两个参数相加并返回。这里可能有的同学会有疑问,这个IMyAidlInterface.Stub是什么鬼,我们也没定义过?其实 这个就是上文提到的编译器自动为我们生成的IMyAidlInterface中定义的,如下图
这下清楚了吧。 最后B应用就搞定了,要想服务生效,别忘了这一步,注册
———————————–华丽的风格线———————————————- 我们将目光回到A应用 绘制下布局,两个输入框一个按钮,具体代码就不说了,直接看Activity,初始化布局
然后我们编写点击函数,我这里偷懒在xml中直接调用点击方法,故定义如下
这里就做了个容错判断,然后将两个输入框中的数字相加,显示在标题栏,恩,这里又偷懒了下,懒得写多个控件。这里相加调用
myAidlInterface.add(num1, num2)
这个myAidlInterface在那里实例化呢?接着往下看,我们在onResume中绑定服务,在onPause中解绑。如下图: 定义连接对象 在这里这个service就是要绑定的远程服务RemoteService中onBind中返回的。myAidlInterface在这里初始化。
这里我们隐式调用B端的远程服务(不能直接引用),在绑定前我们做个容错处理,先判断远程服务是否存在,存在就绑定,并将isBinded置为true,解绑也很简单
现在A端的代码就写完了,我们来看下运行效果:
哈哈,容错处理起作用了,我们编译装下B应用,再次打开A应用
输入数,点击相加,看标题栏,成功了。 那本文到此结束。。。
Demo下载地址: http://download.csdn.net/download/q919233914/9679029