android aidl调用进程间服务的方法
生活随笔
收集整理的這篇文章主要介紹了
android aidl调用进程间服务的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我就拿最近做的項目來說明了,首先創建一個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機制吧,呵呵
總結
以上是生活随笔為你收集整理的android aidl调用进程间服务的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 10系统下 MySql
- 下一篇: Linux IPC实践(7) --Pos