锁定老帖子 主题:AIDL简单入门
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-29
1、 既然AIDL是既然是可以在不同进程间进行操作,那么我们首先就需要准备两个项目,我们先来看看不同的两个项目结构式什么样子的。如图: 我们先暂且定义一个项目为“服务器端项目”,一个为“客户端项目”,其中紫色线框里面的东西是第一个需要注意的地方,就是不管你两个项目包名有多大差异,但是aidl文件必须放置在同一个包下面,而且名字也要相同。 2、 我们现在创建好了项目,下一步就是开发调用接口和实现方法了。其实aidl文件在这里就充当的是一个interface类,你可以在它里面写上你要公布给客户端的调用接口。(具体代码我就不写了,大家可以看我上传的项目)在写aidl接口时,需要注意的是:类命必须和你的aidl文件名相同;必须指明当前包路径;如果是常用类型,如:String、List、int、void之类的,就不需要导入所在包路径了,当使用了外部类时,就需要导入这个类所在的包路径了;书写方法时,每个参数必须指定in或out来表明它是输入参数还是输出参数。 3、 既然aidl我们写完了,那么接下来当然是要去实现这个接口,让它来帮我们做事情了, Aidl因为是远程调用,所以这里你的实现类必须是一个继承Service的类,然后在这个实现类中再去做aidl的实现方法。上图中TestService就是我的实现类,具体代码也请看我上传的项目。不过在TestService需要注意的就是,onBind方法一定要返回你实现的aidl实例对象,供远程调用方使用 public IBinder onBind(Intent intent) { return binder; } 4、 服务端manifest.xml中需要进行如下配置,不然你客户端调用会无法获得你的aidl对象的,我之前做测试的时候,一直被这个问题困扰。 <service android:name="TestService" android:process=":remote"> <intent-filter>配置你的AIDL接口完整路径 <action android:name="com.lifeblood.ITestService" /> </intent-filter> </service> 5、 做完了服务器的工作后,我们再开始做客户端的工作。客户端其实就很简单了,把服务器的aidl拷贝过来,创建一个ServiceConnection用来得到远程onBind中传递过来的aidl接口对象,然后在启动的时候进行一次绑定bindService就可以开始使用aidl中的方法了。 如果各位以后需要使用到aidl,那么只要注意以上说的,我想就不会出现什么大问题了,至少我就是这样走过来的。希望上面的介绍能对各位有帮助,如果中间有错误的地方,也请各位指正,大家共同学习。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-05
回头好好研究下android系统music源码,那里面用到比较多
|
|
返回顶楼 | |
发表时间:2010-05-26
谢谢大虾了,这个问题困扰我好长时间,网上的代码多,但对于一个初学者来说太难,大虾的实例真是太有用了~`
|
|
返回顶楼 | |
发表时间:2010-05-26
你好,我想用您的实例来做个测试,想用aidl来实现android对服务器端的调用,请问在服务器端还需要配置?服务器是tomcat,ide是eclipse
|
|
返回顶楼 | |
发表时间:2010-05-26
如果是android调用服务端程序,那么不需要使用aidl的模式
有很多种方式:http、web service、或是socket都可以,aidl不适合这样的结构 aidl是相当于插件功能,以后你只用更新这个aidl apk,进行功能上的扩展,这样就可以避免主apk程序更新 |
|
返回顶楼 | |
发表时间:2010-07-06
写得很好 谢谢分享
|
|
返回顶楼 | |
发表时间:2010-07-22
如果是不同进程间的Activity可不可以实现AIDL通信呢,provider感觉不是很专业
|
|
返回顶楼 | |
发表时间:2010-10-19
写的这么详细,而且带源码,顶楼主啊!
|
|
返回顶楼 | |
发表时间:2010-10-26
谢谢分享,刚刚下下来,验证了一下,确实比较详细,虽然简单,但是入门已足够了!
|
|
返回顶楼 | |
发表时间:2010-11-19
"其中紫色线框里面的东西是第一个需要注意的地方,就是不管你两个项目包名有多大差异,但是aidl文件必须放置在同一个包下面,而且名字也要相同。 "
>>>>>只要aidl文件在同一工程中就可以了,注意包名和aidl中的包名一样即可 |
|
返回顶楼 | |