Android(安卓)Service学习之AIDL实例
16lz
2021-01-25
【每日话题】国庆放假期间的苦逼事,欢乐事!
http://www.eoeandroid.com/thread-204909-1-1.html
随手记源码啊!!忘记哪里的啦,给大家分享一下
http://www.eoeandroid.com/thread-203718-1-1.html
一个触摸界面会产生小气泡的例子
http://www.eoeandroid.com/thread-203665-1-1.html
由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界。
以下讲对如何实现AIDL调用进行讲解,本文包括AIDL接口调用,回调,以及传递复杂数据类型
Demo运行效果图
Aidl文件
Person.aidlpackage com.archermind.aidl;parcelable Person;ITaskBinder.aidlpackage com.archermind.aidl;import com.archermind.aidl.ITaskCallBack;import com.archermind.aidl.Person;interface ITaskBinder {void fuc01();void fuc02();String fuc03(in Person person);void registerCallBack(ITaskCallBack cb);void unregisterCallBack();}ITaskCallBack.aidlpackage com.archermind.aidl;interface ITaskCallBack {void onActionBack(String str);}
先看Myservice的代码
服务端实现了AIDL的相关接口,供客户端调用
@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn mBinder;}private final ITaskBinder.Stub mBinder=new ITaskBinder.Stub() {@Overridepublic void unregisterCallBack() throws RemoteException {// TODO Auto-generated method stubLog.v(TAG,"unregisterCallBack...");mTaskCallBack=null;}@Overridepublic void registerCallBack(ITaskCallBack cb) throws RemoteException {// TODO Auto-generated method stubLog.v(TAG,"registerCallBack...");mTaskCallBack=cb;}@Overridepublic void fuc01() throws RemoteException {// TODO Auto-generated method stubLog.v(TAG,"fuc01...");}@Overridepublic void fuc02() throws RemoteException {// TODO Auto-generated method stubLog.v(TAG,"fuc02...");mTaskCallBack.onActionBack("hello world");}@Overridepublic String fuc03(Person person) throws RemoteException {// TODO Auto-generated method stubString name=person.getName();String descrip=person.getDescrip();int sex=person.getSex();String ret="";if(sex==0){ret="Hello "+name+",you are handsome"+"("+descrip+")";}else{ret="Hello "+name+",you are beautiful"+"("+descrip+")";}return ret;}};
客户端实现回调接口
private final ITaskCallBack.Stub mCallBack=new ITaskCallBack.Stub() {@Overridepublic void onActionBack(String str) throws RemoteException {// TODO Auto-generated method stubLog.v(TAG,"onActionBack str="+str);}};
客户端如何与服务器绑定并建立连接
Intent intent=new Intent("com.archermind.aidl.myservice");bindService(intent,mConnection,BIND_AUTO_CREATE);private ServiceConnection mConnection=new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubmService=ITaskBinder.Stub.asInterface(service);try {mService.registerCallBack(mCallBack);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}Log.v(TAG,"onServiceConnected");}
详细信息请见附件中的源码工程,希望对大家有用.
更多相关文章
- Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- 一款霸榜 GitHub 的开源 Linux 资源监视器!
- Android学习博客链接
- Handler与Android进程管理
- android Binder工作流程
- 调用Android系统“应用程序信息(Application Info)”界面
- Android(安卓)GestureDetector详解
- Android(安卓)源码分析