AIDL实现进程间通信,应用于电话拦截
2013-06-14 00:07
281 查看
3.AIDL Android
Interface Definition Language:接口描述语言
-----------------------------------------------
跨进程调用Service实例
步骤:
1.在客户端创建接口,比如名字叫 IPlayController
安卓系统会自动生成类 Stub extends Binder implements IPlayController。
类型转换的方法 IPlayController asInterface (IBinder obj)
2.在客户端编写MyService类
MyService的内部类MyBinder继承自Stub类。
其中特别需要注意的是:onBind方法需要返回MyBinder实例。
3.在服务端,同样将接口拷贝过来,IPlayController
4.在服务端的Activity中绑定MyService,并创建获取ServiceConnection的实例,当绑定成功的时候
会回调其onServiceConnection,将传入的参数IBinder实例转换为IPlayController实例。就可以远程调用service的服务方法了
如:
private IPlayController icontroller;
4.AIDL应用:电话,ITelephony
接口:ITelephony.aidl
基本逻辑:参考6.ServiceManager
监听电话应用-拦截电话:
1.拷贝iTelephony.aidl接口
2.获得ITelephony:TelePhonyManager类中有一个私有方法。private ITelephony getITelephony() {
return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
},利用java 的反射机制
如果能或取到ServiceManager类,可以使用正常做法。但是Android的设计将ServiceManager隐藏了,所以只能使用反射机制。
正常做法:
IBinder binder=ServiceManager.getService(TELEPHONY_SERVICE);
ITelephony tel=ITelephony.Stub.asInterface(binder);
tel.endCall();
反射代码:
//获得ServiceManager的类对象,然后获得其方法对象
Method method=Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", String.class);
IBinder binder=(IBinder)method.invoke(null, TELEPHONY_SERVICE)//对于静态方法,第一个参数可以被忽略,即可以将它设置为null
ITelephony tel=ITelephony.Stub.asInterface(binder);//IBinder类型转换为ITelephony类型实例
tel.endCall();
详细介绍参考:http://book.51cto.com/art/201109/291234.htm
Interface Definition Language:接口描述语言
-----------------------------------------------
跨进程调用Service实例
步骤:
1.在客户端创建接口,比如名字叫 IPlayController
安卓系统会自动生成类 Stub extends Binder implements IPlayController。
类型转换的方法 IPlayController asInterface (IBinder obj)
2.在客户端编写MyService类
MyService的内部类MyBinder继承自Stub类。
其中特别需要注意的是:onBind方法需要返回MyBinder实例。
3.在服务端,同样将接口拷贝过来,IPlayController
4.在服务端的Activity中绑定MyService,并创建获取ServiceConnection的实例,当绑定成功的时候
会回调其onServiceConnection,将传入的参数IBinder实例转换为IPlayController实例。就可以远程调用service的服务方法了
如:
private IPlayController icontroller;
ServiceConnection conn=new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder binder) { //获取到controller对象 icontroller=IPlayController.Stub.asInterface(binder); } }; bindService(intent, conn, BIND_AUTO_CREATE); protected void onDestroy() { super.onDestroy(); unbindService(conn); }
4.AIDL应用:电话,ITelephony
接口:ITelephony.aidl
基本逻辑:参考6.ServiceManager
监听电话应用-拦截电话:
1.拷贝iTelephony.aidl接口
2.获得ITelephony:TelePhonyManager类中有一个私有方法。private ITelephony getITelephony() {
return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
},利用java 的反射机制
如果能或取到ServiceManager类,可以使用正常做法。但是Android的设计将ServiceManager隐藏了,所以只能使用反射机制。
正常做法:
IBinder binder=ServiceManager.getService(TELEPHONY_SERVICE);
ITelephony tel=ITelephony.Stub.asInterface(binder);
tel.endCall();
反射代码:
//获得ServiceManager的类对象,然后获得其方法对象
Method method=Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", String.class);
IBinder binder=(IBinder)method.invoke(null, TELEPHONY_SERVICE)//对于静态方法,第一个参数可以被忽略,即可以将它设置为null
ITelephony tel=ITelephony.Stub.asInterface(binder);//IBinder类型转换为ITelephony类型实例
tel.endCall();
详细介绍参考:http://book.51cto.com/art/201109/291234.htm
相关文章推荐
- Android:广播+AIDL实现电话拦截
- android调用ITelephony类,AIDL实现电话,联系人黑名单拦截挂断服务
- android 中使用aidl实现进程间通信
- Android实现进程间通信aidl的使用
- 利用AIDL来实现由Binder进行进程间通信(IPC)
- Android电话拦截及拦截提示音的实现
- Android使用AIDL实现进程间通信
- 这篇文章给大家介绍Android开发四大组件之实现电话拦截和电话录音,涉及到android四大基本组件在程序中的应用,对android四大基本组件感兴趣的朋友可以参考下本篇文章
- android进程间通信AIDL的简单实现。
- 24.Android-实现黑名单电话拦截
- Android 使用 AIDL 实现进程间通信,使用基本类型作为输入和输出参数
- Android使用AIDL实现进程间通信
- 模仿AIDL实现进程间通信
- Android AIDL IPC实现进程间通信
- AIDL实现进程间通信(整理)
- 用BroadcastReceiver实现广播的电话拦截
- Android探索之AIDL实现进程间通信
- AIDL实现Android进程间通信实例
- Service进阶与AIDL实现进程间通信