我们知道,Android是靠Binder机制来实现进程间的通信,而上一篇文章中,我们利用AIDL,简单地从代码方面的角度讲解了在服务端中的Binder的存在形式,是以服务的实现存在的,而在客户端,则是以代理的形式,实现存在的只是一个关于服务端的Binder实现的引用。
理论上的东西我们要去学习掌握,但是也不能忽略了实际的动手能力,对吧。
今天,我们就一步一步地利用我们所了解地关于AIDL的知识来实现一个跨进程通信的例子。
在Android的上层应用中,每一个App都是一个单独的进程,所以,要实现跨进程通信,我们需要至少有2个进程,一个代表服务端,一个代表客户端,所以我们会创建2个项目,来分别代表服务端和客户端。
服务端是提供服务的,得先提供服务,才能让客户端来享受服务,对吧。
服务端
我们创建一个服务端的项目,然后创建我们的aidl文件,毕竟只是一个Demo,所以我先从简单入手,方法不要太多,就叫IDemoService.aidl, 如下:
**[java]** [view plain](http://blog.csdn.net/linmiansheng/article/details/42835229#)[copy](http://blog.csdn.net/linmiansheng/article/details/42835229#)[](https://code.csdn.net/snippets/582805)[](https://code.csdn.net/snippets/582805/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <span class="keyword">package</span> com.lms.service; - - <span class="keyword">interface</span> IDemoService { - <span class="keyword">void</span> invoke(); - } 我们将其放在com.lms.service的包名目录下,表明其是提供服务的,当我们编译一下项目之后,就会发现在gen目录下面同样的包名下,生成了一个IDemoService.java的文件,如下:
而其生成的IDemoService.java文件内容如下,跟上一篇文章中所展现的其实一样,就是一个Stub类和一个Proxy类,如下:
**[java]** [view plain](http://blog.csdn.net/linmiansheng/article/details/42835229#)[copy](http://blog.csdn.net/linmiansheng/article/details/42835229#)[](https://code.csdn.net/snippets/582805)[](https://code.csdn.net/snippets/582805/fork) <div> <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2"> </embed> </div> </div> - <span class="comment">/*</span> - <span class="comment"> * This file is auto-generated. DO NOT MODIFY.</span> - <span class="comment"> * Original file: F:\\workspace_android\\AidlDemoClient\\src\\com\\lms\\service\\IDemoService.aidl</span> - <span class="comment"> */</span> - <span class="keyword">package</span> com.lms.service; - - <span class="keyword">public</span> <span class="keyword">interface</span> IDemoService <span class="keyword">extends</span> android.os.IInterface { - <span class="comment">/** Local-side IPC implementation stub class. */</span> - <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">abstract</span> <span class="keyword">class</span> Stub <span class="keyword">extends</span> android.os.Binder <span class="keyword">implements</span> - com.lms.service.IDemoService { - <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> java.lang.String DESCRIPTOR = <span class="string">“com.lms.service.IDemoService”</span>; - - <span class="comment">/** Construct the stub at attach it to the interface. */</span> - <span class="keyword">public</span> Stub() { - <span class="keyword">this</span>.attachInterface(<span class="keyword">this</span>, DESCRIPTOR); - } - - <span class="comment">/**</span> - <span class="comment"> * Cast an IBinder object into an com.lms.service.IDemoService</span> - <span class="comment"> * interface, generating a proxy if needed.</span> - <span class="comment"> */</span> - <span class="keyword">public</span> <span class="keyword">static</span> com.lms.service.IDemoService asInterface( - android.os.IBinder obj) { - <span class="keyword">if</span> ((obj == <span class="keyword">null</span>)) { - <span class="keyword">return</span> <span class="keyword">null</span>; - } - android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); - <span class="keyword">if</span> (((iin != <span class="keyword">null</span>) && (iin <span class="keyword">instanceof</span> com.lms.service.IDemoService))) { - <span class="keyword">return</span> ((com.lms.service.IDemoService) iin); - } - <span class="keyword">return</span> <span class="keyword">new</span> com.lms.service.IDemoService.Stub.Proxy(obj); - } - - <span class="annotation">@Override</span> - <span class="keyword">public</span> android.os.IBinder asBinder() { - <span class="keyword">return</span> <span class="keyword">this</span>; - } - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">boolean</span> onTransact(<span class="keyword">int</span> code, android.os.Parcel data, - android.os.Parcel reply, <span class="keyword">int</span> flags) - <span class="keyword">throws</span> android.os.RemoteException { - <span class="keyword">switch</span> (code) { - <span class="keyword">case</span> INTERFACE_TRANSACTION: { - reply.writeString(DESCRIPTOR); - <span class="keyword">return</span> <span class="keyword">true</span>; - } - <span class="keyword">case</span> TRANSACTION_invoke: { - data.enforceInterface(DESCRIPTOR); - <span class="keyword">this</span>.invoke(); - reply.writeNoException(); - <span class="keyword">return</span> <span class="keyword">true</span>; - } - } - <span class="keyword">return</span> <span class="keyword">super</span>.onTransact(code, data, reply, flags); - } - - <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> Proxy <span class="keyword">implements</span> com.lms.service.IDemoService { - <span class="keyword">private</span> android.os.IBinder mRemote; - - Proxy(android.os.IBinder remote) { - mRemote = remote; - } - - <span class="annotation">@Override</span> - <span class="keyword">public</span> android.os.IBinder asBinder() { - <span class="keyword">return</span> mRemote; - } - - <span class="keyword">public</span> java.lang.String getInterfaceDescriptor() { - <span class="keyword">return</span> DESCRIPTOR; - } - - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> invoke() <span class="keyword">throws</span> android.os.RemoteException { - android.os.Parcel _data = android.os.Parcel.obtain(); - android.os.Parcel _reply = android.os.Parcel.obtain(); - <span class="keyword">try</span> { - _data.writeInterfaceToken(DESCRIPTOR); - mRemote.transact(Stub.TRANSACTION_invoke, _data, _reply, <span class="number"></span>); - _reply.readException(); - } <span class="keyword">finally</span> { - _reply.recycle(); - _data.recycle(); - } - } - } - - <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> TRANSACTION_invoke = (android.os.IBinder.FIRST_CALL_TRANSACTION + <span class="number"></span>); - } - - <span class="keyword">public</span> <span class="keyword">void</span> invoke() <span class="keyword">throws</span> android.os.RemoteException; - } 既然已经通过aidl生成了这份接口文件,那么根据上一篇文章所讲的,我们接下来就要来实现服务端这边提供的服务了。
...