【移动开发】AIDL中callback的实现
AIDL实现就可以在客户端中调用服务端的方法,并传递数据到服务端,也可以服务端传递数据过来;但是如果要从服务端去调用客户端的方法,那么就需要注册callback!
抄自和源码:http://zxl-ong.iteye.com/blog/736888
前面的文件讲到用AIDL来实现进程间的通信,但是只讲到客户端调用服务端的方法,现在来看看服务端对客户端方法的调用callback!
服务端对客户端的调用主要用到了RemoteCallbackList这个类;
一、服务端
首先必须写客户端对服务端调用的一个AIDL文件:
- package net.blogjava.mobile.complex.type.aidl;
- import net.blogjava.mobile.complex.type.aidl.Product;
- import net.blogjava.mobile.complex.type.aidl.ITaskCallback;
- interface IMyService
- {
- //客户端对服务端调用的方法 Map getMap(in String country, in Product product);
- Product getProduct();
- void getProduc(out Product product);
- //用来注册回调的对象
- void registerCallback(ITaskCallback cb);
- void unregisterCallback(ITaskCallback cb);
- }
这个文件会生成一个.java文件;
然后再新建一个类并extend service,用于AIDL的服务;在服务中重写onbind()函数并实现AIDL中的方法:
- public class MyServiceImpl extends IMyService.Stub
- {
- @Override
- public Product getProduct() throws RemoteException
- {
- Product product = new Product();
- product.setId(1234);
- product.setName("汽车");
- product.setPrice(31000);
- return product;
- }
- @Override
- public void getProduc(Product product) throws RemoteException {
- if(product == null) product = new Product();
- product.setId(1234);
- product.setName("飞机");
- product.setPrice(62000);
- }
- @Override
- public Map getMap(String country, Product product)
- throws RemoteException
- {
- Map map = new HashMap<String, String>();
- map.put("country", country);
- map.put("id", product.getId());
- map.put("name", product.getName());
- map.put("price", product.getPrice());
- map.put("product", product);
- return map;
- }
- @Override
- public void registerCallback(ITaskCallback cb) throws RemoteException {
- if(cb != null)
- mCallbacks.register(cb);
- }
- @Override
- public void unregisterCallback(ITaskCallback cb) throws RemoteException {
- if(cb != null)
- mCallbacks.unregister(cb);
- }
- }
- @Override
- public IBinder onBind(Intent intent)
- {
- return new MyServiceImpl();
- } private RemoteCallbackList<ITaskCallback> mCallbacks;
mCallbacks.register(cb);是RemoteCallbackList的一个方法;客户端中必须在得到这个service后,调用这个方法来注册回调函数;
客户端注册成功后,便可以通过以下方法来调用回调函数:
- void callback(int startId) {
- //返回boardcast中的回调函数的个数
- final int N = mCallbacks.beginBroadcast();
- Log.i(TAG, "mCallbacks.beginBroadcast() :" + N);
- for (int i = 0; i < N; i++) {
- Log.i(TAG, "I = "+String.valueOf(i));
- try {
- mCallbacks.getBroadcastItem(i).clientTackCallBack(startId);
- } catch (RemoteException e) {
- // The RemoteCallbackList will take care of removing
- // the dead object for us.
- }
- }
- mCallbacks.finishBroadcast();
- }
mCallbacks.beginBroadcast();返回的是注册的回调函数的个数;
二、客户端
客户端必须先把AIDL文件复制过来,或者直接复制生成的gen/.java到src下;
首先是得到进程共享:
- bindService(new Intent("net.blogjava.mobile.complex.type.aidl.IMyService"),
- serviceConnection, Context.BIND_AUTO_CREATE);
- <p>private ServiceConnection serviceConnection = new ServiceConnection()
- {</p><p> @Override
- public void onServiceConnected(ComponentName name, IBinder service)
- {
- myService = IMyService.Stub.asInterface(service);
- try {
- myService.registerCallback(mCallback);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- btnInvokeAIDLService.setEnabled(true);</p><p> }</p><p> @Override
- public void onServiceDisconnected(ComponentName name)
- {
- // TODO Auto-generated method stub</p><p> }</p>
在得到服务端的服务的时候必须注册回调函数;以下是回调的实现:
- private ITaskCallback mCallback = new ITaskCallback.Stub() {
- @Override
- public void clientTackCallBack(int actionId) throws RemoteException {
- Log.i(TAG, "actionId :" + actionId);
- }
- };
这样在服务端中调用callback()函数就是调用了这里的clientTackCallBack(),从而实现了服务端对客户端的回调;
【移动开发】AIDL中callback的实现的更多相关文章
- 谈谈我对Java中CallBack的理解
谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...
- (转载)你真的理解Android AIDL中的in,out,inout么?
前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了——或者并没有,但所占篇幅甚小,且基本上都是 ...
- iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- Idea开发环境中搭建Maven并且使用Maven打包部署程序
1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME的环境变量,然后将该变量添加到Path中 备注:必须要有JAVA_HOM ...
- Wabpack系列:在webpack+vue开发环境中使用echarts导致编译文件过大怎么办?
现象,在一个webpack+vue的开发环境中,npm install echarts --save了echarts,然后在vue文件中直接使用 import echarts from 'echart ...
- 开发环境中biztalk项目设置注意事项(转)
适用版本:biztalk 2006 适用环境:开发测试环境 在开发过程中,在开发环境中,一定会是一个对项目不断的修改.编译.部署.测试,查看测试结果,发现有问题,然后回到开发环境再修改.编译.部署 ...
- git 一般的开发流程中的代码管理
一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...
- iOS 自定义控件开发(中)
<iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...
- 将linux用在开发环境中
我是如何将linux用在开发环境中的 1.为什么不直接安装Linux在主机 一直想深入学习一下linux的使用,于是将家里的笔记本装了linux系统,但是要将自己的系统打造一个适合开发的环境确实是一件 ...
随机推荐
- 【BZOJ4034】【HAOI2015】树上操作
题目请自行查阅传送门. 典型的树剖题,线段树维护操作,记一下子树在线段树内范围即可. 时间复杂度:\( O(m \log^{2} n) \) #include <stdio.h> #def ...
- 2015 多校联赛 ——HDU5294(最短路,最小切割)
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- bzoj 3679: 数字之积
Description 一个数x各个数位上的数之积记为\(f(x)\) 求[L,R)中满足\(0<f(x)<=n\)的数的个数 solution 最后\(f(x)\)可以拆分成2,3,5, ...
- MYSQL 二进制安装
系统环境:CentOs6.7 i386 Mysql版本:mysql-5.6.36 root登录linux cd pwd #/root/ wget http://mirrors.sohu.com/mys ...
- 【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控
[写在前面] 用Tensorflow(TF)已实现好的卷积神经网络(CNN)模型来训练自己的数据集,验证目前较成熟模型在不同数据集上的准确度,如Inception_V3, VGG16,Inceptio ...
- 镜像文件、光盘、iso文件、启动盘
刚入大学,有一门计算机硬件维修课程,韩国彬老师(学生们公认的好老师).当时韩老师教给了我们好多实用的好东西,例如装系统,做镜像文件,装虚拟机,ghost版本系统,计算机组装等等.由于高中刚刚过度到大学 ...
- sharepoint环境安装
SharePoint 2013 测试环境安装配置指南 软件版本 Windows Server 2012 标准版 SQL Server 2012 标准版 SharePoint Server 2013 企 ...
- C语言程序设计第一次作业1
(一)实验总结 1. 圆面积问题 1:求圆面积和周长 (1)输入圆的半径,计算圆的周长和面积. (2) (3) 2:判断闰年 (1)输入一个四位年份,判断其是否是闰年.闰年的判别条件是该年年份能被4整 ...
- Windows 2008 R2_NLB网络负载均衡(图文详解)(转)
目录 前言 软件环境 DNS域名服务器 DNS服务器原理 DNS域名空间 DNS区域 DNS服务器的类别 DNS查询模式 缓存文件 配置DNS服务器 DNS服务的应用 新建子域 在DNS正向解析中新建 ...
- JS区分中英文字符的两种方法: 正则和charCodeAt()方法
1.正则regExpForm.onblur=function(){ entryVal=this.value; entryLen=entryVal.length; cnChar=entryVal.mat ...