Android之使用AIDL与远程服务实现进程通信

2014-11-24 10:53:38 ? 作者: ? 浏览: 0

【0】通过startService()stopService()启动关闭服务。适用于服务和Activity之间没有调用交互的情况。


如果相互之间需要方法调用或者传递参数,需要使用bindService()unbindService()方法启动关闭服务。


采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候调用者和服务绑定在一起。 如果客户端要与服务进行通信,那么,onBind()方法必须返回Ibinder对象。如果调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用nbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法


AIDL(Android Interface Definition Language:接口描述语言)是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)AIDLIPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对象。由于进程之间的通信信息需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。


【2】实现进程通信,一般需要下面四个步骤



当完成aidl文件创建后,eclipse会自动在项目的gen目录中同步生成IDownloadService.java接口文件。接口文件中生成一个Stub的抽象类,里面包括aidl定义的方法,还包括一些其它辅助方法。值得关注的是asInterface(IBinder iBinder),它返回接口类型的实例,对于远程服务调用,远程服务返回给客户端的对象为代理对象,客户端在onServiceConnected(ComponentName name, IBinder service)方法引用该对象时不能直接强转成接口类型的实例,而应该使用asInterface(IBinder iBinder)进行类型转换。


编写Aidl文件时,需要注意下面几点:


1.接口名和aidl文件名相同。


2.接口和方法前不用加访问权限修饰符public,private,protected,也不能用final,static


3.Aidl默认支持的类型包话java基本类型(intlongboolean等)和(StringListMapCharSequence),使用这些类型时不需要import声明。对于ListMap中的元素类型必须是Aidl支持的类型。如果使用自定义类型作为参数或返回值,自定义类型必须实现Parcelable接口。


4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。


5.aidl文件中所有非Java基本类型参数必须加上inoutinout标记,以指明参数是输入参数、输出参数还是输入输出参数。


6.Java原始类型默认的标记为in,不能为其它标记。



其他应用可以通过隐式意图访问服务,意图的动作可以自定义,AndroidManifest.xml配置代码如下:


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: