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

本文介绍如何通过AIDL实现FM收音机服务的接口定义及其实现,并展示了如何在不同应用间进行服务通信。

我就拿最近做的项目来说明了,首先创建一个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机制吧,呵呵

转载于:https://www.cnblogs.com/andriod-html5/archive/2012/04/20/2539225.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值