如何定义AIDL跨进程间通信
2015-07-24 14:41
483 查看
当进程A要去调用进程B中的service时,并实现通信,我们通常都是通过AIDL来操作的
projectA:
首先在我们自己的包com.wzp.aidlservice中创建一个RemoteService.aidl文件,在里面我们自己定义一个接口,含有方法getService()。ADT插件会在gen文件夹下自己主动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.Stub的内部类,该内部类中含有AIDL文件接口的getService()方法
比如:
说明一:AIDL文件的位置不固定,能够随意,还有不要在定义接口中使用修饰符(private,public这些)
接着,定义自己的MyService类,在MyService类中,定义一个内部类去继承RemoteService.Stub这个内部类。实现getService方法。在onBind方法中返回这个内部类的对象,系统会自己主动将这个对象封装成IBinder对象,传递给它的调用者。
比如:
然后,须要在AndroidManifest.xml文件里配置MyService类。代码例如以下:
指定调用AIDL服务的ID是为了告诉外界(其它进程)MyService这个类可以被别的进程訪问。仅仅要别的进程知道这个ID,就行实现通信。即本例中。进程B可以找到进程A实现通信。
注意:AIDL并不须要权限
projectB:
首先我们要将projectA中生成的RemoteService.java文件复制到projectB中。在bindService方法中绑定AIDL。服务绑定AIDL服务就是将RemoteService的ID作为intent的action參数。
说明:假设我们单独将RemoteService.aidl文件放在一个包里。那么在我们将gen文件夹下的该包复制到projectB中。假设我们将RemoteService.aidl文件和我们的其它类存放在一起。那么我们在projectB中就要建立对应的包,以保证RmoteService.java文件的包名正确,并且我们不能改动RemoteService.java文件
bindService(new Intent("com.wzp.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE);
ServiceConnection的onServiceConnected(ComponentName
name,IBinder service)方法中的service參数就是projectA中MyService类中继承了RemoteService.Stub类的内部类的对象。
projectA:
首先在我们自己的包com.wzp.aidlservice中创建一个RemoteService.aidl文件,在里面我们自己定义一个接口,含有方法getService()。ADT插件会在gen文件夹下自己主动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.Stub的内部类,该内部类中含有AIDL文件接口的getService()方法
比如:
package com.wzp.aidlservice; interface RemoteService { String getService(); }
说明一:AIDL文件的位置不固定,能够随意,还有不要在定义接口中使用修饰符(private,public这些)
接着,定义自己的MyService类,在MyService类中,定义一个内部类去继承RemoteService.Stub这个内部类。实现getService方法。在onBind方法中返回这个内部类的对象,系统会自己主动将这个对象封装成IBinder对象,传递给它的调用者。
比如:
public class MyService extends Service { public class MyServiceImpl extends RometeService.Stub { @Override public String getService() throws RemoteException { return "AIDL样例"; } } @Override public IBinder onBind(Intent intent) { return new MyServiceImpl(); } }在onBind方法一定要返回MyServiceImpl类的对象实例,不然调用者是获取不到服务对象的
然后,须要在AndroidManifest.xml文件里配置MyService类。代码例如以下:
<!-- 注冊服务 --> <service android:name=".MyService"> <intent-filter> <!-- 指定调用AIDL服务的ID --> <action android:name="com.wzp.aidlservice.RemoteService"/> </intent-filter> </service>
指定调用AIDL服务的ID是为了告诉外界(其它进程)MyService这个类可以被别的进程訪问。仅仅要别的进程知道这个ID,就行实现通信。即本例中。进程B可以找到进程A实现通信。
注意:AIDL并不须要权限
projectB:
首先我们要将projectA中生成的RemoteService.java文件复制到projectB中。在bindService方法中绑定AIDL。服务绑定AIDL服务就是将RemoteService的ID作为intent的action參数。
说明:假设我们单独将RemoteService.aidl文件放在一个包里。那么在我们将gen文件夹下的该包复制到projectB中。假设我们将RemoteService.aidl文件和我们的其它类存放在一起。那么我们在projectB中就要建立对应的包,以保证RmoteService.java文件的包名正确,并且我们不能改动RemoteService.java文件
bindService(new Intent("com.wzp.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE);
ServiceConnection的onServiceConnected(ComponentName
name,IBinder service)方法中的service參数就是projectA中MyService类中继承了RemoteService.Stub类的内部类的对象。
相关文章推荐
- [LeetCode]Container With Most Water
- 2015 Multi-University Training Contest 2
- 2015 Multi-University Training Contest 2
- Snail—OC学习之选择器SEL
- Snail—OC学习之可变字典NSMutableDictionary
- Naigos PNP图无法加载最新数据
- Snail—OC学习之字典NSDictionary
- DNN报错:The compiler failed with error code 1.
- 2015 Multi-University Training Contest 2
- Naigos PNP图无法加载最新数据
- UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)
- Chain of Responsibility Pattern
- 朴素贝叶斯方法(Naive Bayes Method)
- mybatis 批量增加 Parameter '__frch_item_0' not found. Available parameters are [list]
- Algorithms—24.Swap Nodes in Pairs
- <学习笔记> public static void main(String[] args)小结
- linker command failed with exit code 1 错误小结
- hdu1151 air Raid(最小路径覆盖)
- [ 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 模拟题
- 10亿美金的教训——我居然错过Airbnb的天使轮