我就拿最近做的项目来说明了,首先创建一个IFMService.aidl的接口文件,在R.java的目录下会自动生成IFMService.java 的文件, 接口文件的内容如下:
package net.kindroid.fm; interface IFMService { /** * open FM */ boolean openFM(); /** * close FM */ boolean closeFM(); /** * whether FM is open */ boolean isOpen(); /** * set a special frequency to the FM */ int setCurrentFrequency(in int frequency); /** * search FM tunes */ boolean searchStation(in int start,in int direction,in int timeout,in int reserve); /** * get current Frequency */ int getCurrentFrequency(); /** * stop search FM */ boolean stopSearch(); /** * set FM volume */ boolean setVolume(in int value); /** * get current Volume */ int getCurrentVolume(); /** * set current mute mode */ int setMuteMode(in int mode); }public class FMService extends Service:实现如下:
public class MyServiceimpl extends IFMService.Stub { WeakReference<FMService> mService; MyServiceimpl(FMService service) { mService = new WeakReference<FMService>(service); } @Override public boolean openFM() throws RemoteException { return mService.get().openFM(); } @Override public boolean closeFM() throws RemoteException { return mService.get().closeFM(); } @Override public boolean isOpen() throws RemoteException { return mService.get().isOpen(); } @Override public boolean searchStation(int start, int direction, int timeout, int reserve) throws RemoteException { return mService.get().searchStation(start, direction, timeout, reserve); } @Override public int getCurrentFrequency() throws RemoteException { return mService.get().getTunedFrequency(); } @Override public boolean stopSearch() throws RemoteException { return mService.get().stopSearch(); } @Override public boolean setVolume(int value) throws RemoteException { return mService.get().setVolume(value); } @Override public int getCurrentVolume() throws RemoteException { return mService.get().getCurrentVolume(); } @Override public int setMuteMode(int mode) throws RemoteException { return mService.get().setMuteMode(mode); } @Override public int setCurrentFrequency(int frequency) throws RemoteException { return mService.get().setCurrentFrequency(frequency); } }
在service里面实现get().的那些方法即可在当前app里面使用这个service了
那么如何在其他app里面使用到这个service呢?
在要使用上面服务的那个app的src目录下面新建一个目录树,要和IFMService的package相对应,比如本例的net.kindroid.fm,然后把生成后的IFMService.java文件拷贝到新建的这个目录树下面,那么在代码里面就可以使用了:
mContext.startService(new Intent("net.kindroid.aidl.service.IFMService")); mContext.bindService(new Intent("net.kindroid.aidl.service.IFMService"), serviceConnection, Context.BIND_AUTO_CREATE);使用的方法和service的那个app类似,就可以调用我们刚刚写的那个service了,还是贴上使用的方法吧:
if (mFMService == null) { try { // start server this.startService(new Intent("net.kindroid.aidl.service.IFMService")); bindService(new Intent("net.kindroid.aidl.service.IFMService"), serviceConnection, Context.BIND_AUTO_CREATE); } catch (Exception e) { } }
这样就实现了进程间的服务通讯了,具体的底层机制呢,大家研究一下binder机制吧,呵呵