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调用进程间服务的方法相关推荐
- Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)
文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...
- Android 使用AIDL实现进程间的通信
在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...
- 使用AIDL实现进程间的通信
在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(Android Interface Definition Language)是一种接口定义语言,编译器通 ...
- android 使用AIDL实现进程间通讯
一.创建服务端 1.首先创建AIDL文件 2.创建service,绑定AIDL接口 3.配置service <service android:name=".AidlService&qu ...
- 使用AIDL实现进程间的通信之复杂类型传递
上次讲到简单的AIDL进程间通信的操作,客户端向服务端发送一个String类型的参数,服务端也返回一个String类型的结果,看似已经可以完成基本的需要了.不过在有的时候,简单的数据类型并不能满足我们 ...
- Android Fragment 调用宿主Activity 里面的方法
方法 1 : 直接在Fragment 写 MainActivity main = (MainActivity) getActivity();main.xx; // xx 是 MainActivity ...
- ShellExecuteEx API 阻塞和异步调用进程的两种方法
阻塞: SHELLEXECUTEINFO ShExecInfo = { 0 }; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fM ...
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
概述 最近在学习Binder机制,在网上查阅了大量的资料,也看了老罗的Binder系列的博客和Innost的深入理解Binder系列的博客,都是从底层开始讲的,全是C代码,虽然之前学过C和C++,然而 ...
- android p获取通话记录_Android 底层的进程间同步机制
作者:Android面试官 进程间通信的经典实现 进程间通信(Inter-process communication,IPC)指运行在不同进程中的若干线程间的数据交换,可发生在一台机器上,也可通过网络 ...
最新文章
- Java项目:农资采购销售系统(java+SSM+Easyui+maven+Mysql)
- 【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )
- ADO.NET Entity Framework Beta2(五)/快速入门(实体框架)
- 中国人终于开始排队了
- rocketmq的有序消费模式和并发消费模式的区别
- IEEE Access的模板的问题
- 使用Setup Factory如何制作程序安装包
- 如何正确使用RS485半双工芯片
- 【WINAPI】CreateSemaphore_信号量
- Linux 关闭 开启防火墙命令
- 各互联网技术领域pdf图书合集(百度网盘)
- [北航软工教学] 教学计划大纲
- 武大教授计算机学院,武汉大学姬东鸿教授访问计算机科学学院和智能信息处理及应用实验室...
- 游戏黑客圣经GHB1学习笔记 part1(1-5)
- 联志服务器修改启动项,双塔奇兵,来自联志的两款服务器机箱
- 怎么获取机智股票自动交易软件
- 获取第三方公众号/订阅号原始二维码
- StringBoot(模板 Thymeleaf 高阶用法)
- 绕过网站安全狗,方法 适合所有
- 计算机辅助语言学,计算机辅助语言教学的历史发展与前景展望.pdf
热门文章
- jquery文件上传插件 uploadify java_jQuery文件上传插件Uploadify使用指南
- mysql 先排序再去重_有人说先学会三轴,再去搞四轴、五轴加工中心,这几种有何区别?...
- android布局加色,android – 如何以编程方式将LinearLayout添加背景颜色,并将权重添加到另一个布局...
- linux pcl 转图片,PCL转图片工具Mgosoft PCL To Image Converter
- 直播预告丨企服企业如何科学搭建规模化获客体系?
- CEO 赠书 |《跨越鸿沟》如何将梦想变为现实?
- SSM框架之MyBatis3专题5:MyBatis注解式开发
- 云栖Android精华文章合集
- 《趣题学算法》—第0章0.3节算法的伪代码描述
- java中Class.getResource用法(用于配置文件的读取)