Android基础进阶之学习使用AIDL进行跨进程通信
- AIDL是什么
AIDL (Android Interface Definition Language), 即接口定义语言,Android提供的IPC (InterProcess Communication,进程间通信)的一种独特实现。 借助它,你可以定义接口,使得用户端和服务端之间实现进程间通信。对android来说,一个进程无法通过正常的方法来访问另一个进程的内存空间。可以说,他们需要把对象分解成操作系统可以了解的原子类型,而后使对象突破限制在不同进程之间进行传输。具体实现这种机制的代码写起来非常枯燥,所以android为你提供了AIDL语言来进行解决。
- 使用AIDL可以处理什么样的问题
当你需要来自不同应用的用户端访问你的服务时,你就需要一个AIDl了。 举个小栗子: 手机管家提供了黑名单、号码阻拦等服务,手机通信录、短信等应用需要实时获取已经被加入给名单或者者标记的号码,而这部分数据是存储在手机管家这个app的数据库中。那么,为了方便通讯录和短信这些应用访问数据,手机管家即可以通过实现AIDL提供这项服务。
- 手把手教你写一个Demo感受Aidl的使用
第一步:编写Server端(提供服务方) 1.在工程目录下,定义一个Aidl文件。New-File
image
- 2. 编写这个文件,AIDL使用简单的语法可以公告一个带有一个或者者多个带有参数和返回值方法的接口参数和返回值可以是任何类型。非常相似Java。 在这里,我们尝试在接口中定义两个方法。一个返回String类型,一个返回Int型。
image
- 3.建立一个提供这项服务的Service 假如eclipse有自动编译的话,或者者手动clean一下项目,就会发现在工程的gen目录下,SDK工具已经生成一个.java接口文件(和.aidl文件同名)。主要包含一个名字为Stub的子类,这是一个它父类的笼统实现,并且公告了.aidl中所有的方法。
image
其中Stub类有一个叫asInterface的静态方法,主要用来返回这个Stub接口的实例。
- 4.把接口暴露给用户端(其余需要此方法的应用),这就需要继承Service实现onBind方法,并返回一个你已经实现了的Stub类。 testString 这个方法,返回了一个字符串拼接的结果;testInt 这个方法,返回的是两个int值相加求和的结果。
image
- 5.当然还有最重要的,也是初学者容易忽略的几点。涉及到的service要在AndroidManifest.xml中注册,注意肯定要增加android:exported=”true”属性(否则会在用户端访问时报安全异常)。并且记得在server应用启动时,触发启动这个提供服务的AidlService.java。 如此,服务端就算部署完成了。 第二步:编写用户端(获取服务方)
1. 把Server端中的IService.aidl拷贝一份到Client端工程目录下,注意放的路径的包名肯定要和Server端相同。
2. 在Client端的MainActivity中,实现一个ServiceConnection对象,在这个对象的onServiceConnected回调方法中,即可以拿到我们所需要的提供远程服务的对象。
image
3. 编写连接这个服务和断开这个服务的方法。分别在MainActivity的onCreate和onDestroy方法中调用。
image
如此,用户端调用方式基本明朗。编写完毕。
- 第三步:效果演示
首先,我们运行一下server端,打开remote远程AidlService,使其在运行中。而后运行Client应用,打Log,结果如下:
image
关闭Client应用,结果如下:
image
综上:
这个小demo,简单实现了服务端为用户端提供服务的过程。并且形象的感受到IService.aidl文件就像一个桥梁一样铺设在两个应用之间,完美的完成了方法和数据传输的任务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android基础进阶之学习使用AIDL进行跨进程通信