日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android aidl调用进程间服务的方法

發布時間:2025/3/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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) { } }


?

/** * fm service */ private IFMService mFMService = null;/** * fm service connection */ private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mFMService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mFMService = IFMService.Stub.asInterface(service); if (hasData()) { SharedPreferences settings = getSharedPreferences(FMRADIO_DATA, 0); int current = settings.getInt(CHANNEL_VALUE, 1017); if (digitView != null) { try { if (mFMService != null && !mFMService.isOpen()) { if (!FMService.isMusicVolumeFocus && !isCallState()) { mFMService.openFM(); play.setBackgroundResource(R.drawable.stop); setEnabled(true); setChannelToPlay(current); setVolume(); } else { digitView.setChannel(current); updateRedLine(current); } } else { digitView.setChannel(current); updateRedLine(current); } } catch (Exception e) { } } } } };


這樣就實現了進程間的服務通訊了,具體的底層機制呢,大家研究一下binder機制吧,呵呵

總結

以上是生活随笔為你收集整理的android aidl调用进程间服务的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。