Android进程间通信--AIDL

来源:互联网 发布:重生之星际淘宝主 bl 编辑:程序博客网 时间:2024/06/09 20:29

最近学习了下Android进程间通信,可能都是比较基础的东西,但是自己还是写下来,方便日后自己要用的时候可以直接使用,也为和我一样对这块想要了解的骚年们提供点基础知识吧,

Android进程间通信个人认为有,contentProvider,broadcast,AIDL,sharedpreference,还有网络,数据库等。

今天我们要说的是AIDL:全称为Android interface definition language安卓接口定义语言

对个人来讲,现阶段AIDL的使用,基本和service相结合,通过client调用server端的service。

AIDL IPC机制是面向接口的,较轻量级,他是使用代理类在客户端和实现端数据传递。

java代码如下:

server端:

首先根据需求在src目录下定义一个aidl的文件,如IMusic.aidl,和我们定义的接口差不多,不过注意其中的语法,和包名(和client一致)

区别:
a、除了Java基本数据类型 (int, long, char, boolean等)、String、CharSequence、List、Map外,其他复杂类型都需要显式import(包括其他AIDL定义的接口),即便是在同一个包内定义。
b、支持泛型实例化的List,如List<String>;不支持泛型实例化的Map,如Map<String, String>。对于List为参数接收者接收到的始终是ArrayList;对于Map为参数接收者接收到的始终是HashMap。
c、interface和函数都不能带访问权限修饰符。
d、接口内只允许定义方法,不允许定义静态属性。

package com.example.aidlserver.inner;
import com.example.aidlserver.inner.MyMusic;
interface IMusic{
MyMusic doPlay();
void doPause();
void doStop();
void doResume();
}

注意:MyMusic doPlay()和void doPause(),前者还需要定义一个MyMusic的实体类,并且需要实现Parcelable,需要重写其中的几个方法,你可以把鼠标放在Parcelable上根据提示在提示中进行复制粘贴,另外还需要一个MyMusic的aidl文件,其中Imusic的aidl会在gen目录下自动生成一个Imusic的java文件,需要稍微看下其中的代码,因为之后的编写需要用到,而MyMUSIC的aidl不会在gen目录下生成java文件,好了,服务端的aidl文件基本完成,然后就是service文件啦,

需要一个继承service的类,在onbind方法中,return一个继承IMusic.stub的类(MyBind),这个通过Imusic。java文件了解到:

gen目录下生成的IMusic。java   abstract class Stub extends android.os.Binder implements com.example.aidlserver.inner.IMusic

在Mybind中重写接口方法,service操作都在这里面实现。

别忘了在manifest文件中配置service intent-filter,供client端使用

到此处server端基本完成,记住这里server端只提供服务,没有实现任何功能。


client端:调用server端的服务

可以直接把server端的aidl文件包复制到client,注意包名相同,因为是通过代理实现的功能,

client端通过intent调用server端的服务,刚才上面的intent-filter  action,进行bindservice,需要一个ServiceConnection,在接口ServiceConnection中需要实现两个方法,一个是onServiceDisconnected--连接失败,另外一个是连接成功--onServiceConnected,在这里进行onbind的调用

public void onServiceConnected(ComponentName name, IBinder service) {
//service连接成功,传入service端的Ibinder对象
iMusic=IMusic.Stub.asInterface(service);
}

注意查看--同样gen目录下的java文件中有一句com.example.aidlserver.inner.IMusic asInterface(android.os.IBinder obj)


绑定服务后,基本功能就可以实现和完善啦,



上述只是实现aidl的实例,各位可以结合自己的需要进行完善,本人也是刚接触Android不久,希望通过这种方式提高自己,文章中有很多错误,希望各位资深的盆友能过支出,我好及时学习改正,大家一起提高,如果有误导到大家的还请原谅和指出,谢谢!

1 0