AIDL实现就可以在客户端中调用服务端的方法,并传递数据到服务端,也可以服务端传递数据过来;但是如果要从服务端去调用客户端的方法,那么就需要注册callback!

抄自和源码:http://zxl-ong.iteye.com/blog/736888

前面的文件讲到用AIDL来实现进程间的通信,但是只讲到客户端调用服务端的方法,现在来看看服务端对客户端方法的调用callback!

服务端对客户端的调用主要用到了RemoteCallbackList这个类;

一、服务端

首先必须写客户端对服务端调用的一个AIDL文件:

  1. package net.blogjava.mobile.complex.type.aidl;
  2. import net.blogjava.mobile.complex.type.aidl.Product;
  3. import net.blogjava.mobile.complex.type.aidl.ITaskCallback;
  4. interface IMyService
  5. {
  6. //客户端对服务端调用的方法                                                                                                         Map getMap(in String country, in Product product);
  7. Product getProduct();
  8. void getProduc(out Product product);
  9. //用来注册回调的对象
  10. void registerCallback(ITaskCallback cb);
  11. void unregisterCallback(ITaskCallback cb);
  12. }

这个文件会生成一个.java文件;

然后再新建一个类并extend service,用于AIDL的服务;在服务中重写onbind()函数并实现AIDL中的方法:

  1. public class MyServiceImpl extends IMyService.Stub
  2. {
  3. @Override
  4. public Product getProduct() throws RemoteException
  5. {
  6. Product product = new Product();
  7. product.setId(1234);
  8. product.setName("汽车");
  9. product.setPrice(31000);
  10. return product;
  11. }
  12. @Override
  13. public void getProduc(Product product) throws RemoteException {
  14. if(product == null) product = new Product();
  15. product.setId(1234);
  16. product.setName("飞机");
  17. product.setPrice(62000);
  18. }
  19. @Override
  20. public Map getMap(String country, Product product)
  21. throws RemoteException
  22. {
  23. Map map = new HashMap<String, String>();
  24. map.put("country", country);
  25. map.put("id", product.getId());
  26. map.put("name", product.getName());
  27. map.put("price", product.getPrice());
  28. map.put("product", product);
  29. return map;
  30. }
  31. @Override
  32. public void registerCallback(ITaskCallback cb) throws RemoteException {
  33. if(cb != null)
  34. mCallbacks.register(cb);
  35. }
  36. @Override
  37. public void unregisterCallback(ITaskCallback cb) throws RemoteException {
  38. if(cb != null)
  39. mCallbacks.unregister(cb);
  40. }
  41. }
  42. @Override
  43. public IBinder onBind(Intent intent)
  44. {
  45. return new MyServiceImpl();
  46. }                                                                                        private RemoteCallbackList<ITaskCallback> mCallbacks;

mCallbacks.register(cb);是RemoteCallbackList的一个方法;客户端中必须在得到这个service后,调用这个方法来注册回调函数;

客户端注册成功后,便可以通过以下方法来调用回调函数:

  1. void callback(int startId) {
  2. //返回boardcast中的回调函数的个数
  3. final int N = mCallbacks.beginBroadcast();
  4. Log.i(TAG, "mCallbacks.beginBroadcast() :" + N);
  5. for (int i = 0; i < N; i++) {
  6. Log.i(TAG, "I = "+String.valueOf(i));
  7. try {
  8. mCallbacks.getBroadcastItem(i).clientTackCallBack(startId);
  9. } catch (RemoteException e) {
  10. // The RemoteCallbackList will take care of removing
  11. // the dead object for us.
  12. }
  13. }
  14. mCallbacks.finishBroadcast();
  15. }

mCallbacks.beginBroadcast();返回的是注册的回调函数的个数;

二、客户端

客户端必须先把AIDL文件复制过来,或者直接复制生成的gen/.java到src下;

首先是得到进程共享:

  1. bindService(new Intent("net.blogjava.mobile.complex.type.aidl.IMyService"),
  2. serviceConnection, Context.BIND_AUTO_CREATE);
  1. <p>private ServiceConnection serviceConnection = new ServiceConnection()
  2. {</p><p>  @Override
  3. public void onServiceConnected(ComponentName name, IBinder service)
  4. {
  5. myService = IMyService.Stub.asInterface(service);
  6. try {
  7. myService.registerCallback(mCallback);
  8. } catch (RemoteException e) {
  9. e.printStackTrace();
  10. }
  11. btnInvokeAIDLService.setEnabled(true);</p><p>  }</p><p>  @Override
  12. public void onServiceDisconnected(ComponentName name)
  13. {
  14. // TODO Auto-generated method stub</p><p>  }</p>

在得到服务端的服务的时候必须注册回调函数;以下是回调的实现:

  1. private ITaskCallback mCallback = new ITaskCallback.Stub() {
  2. @Override
  3. public void clientTackCallBack(int actionId) throws RemoteException {
  4. Log.i(TAG, "actionId :" + actionId);
  5. }
  6. };

这样在服务端中调用callback()函数就是调用了这里的clientTackCallBack(),从而实现了服务端对客户端的回调;

【移动开发】AIDL中callback的实现的更多相关文章

  1. 谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...

  2. (转载)你真的理解Android AIDL中的in,out,inout么?

    前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了——或者并没有,但所占篇幅甚小,且基本上都是 ...

  3. iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  4. Idea开发环境中搭建Maven并且使用Maven打包部署程序

    1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME的环境变量,然后将该变量添加到Path中 备注:必须要有JAVA_HOM ...

  5. Wabpack系列:在webpack+vue开发环境中使用echarts导致编译文件过大怎么办?

    现象,在一个webpack+vue的开发环境中,npm install echarts --save了echarts,然后在vue文件中直接使用 import echarts from 'echart ...

  6. 开发环境中biztalk项目设置注意事项(转)

      适用版本:biztalk 2006 适用环境:开发测试环境 在开发过程中,在开发环境中,一定会是一个对项目不断的修改.编译.部署.测试,查看测试结果,发现有问题,然后回到开发环境再修改.编译.部署 ...

  7. git 一般的开发流程中的代码管理

    一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...

  8. iOS 自定义控件开发(中)

    <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...

  9. 将linux用在开发环境中

    我是如何将linux用在开发环境中的 1.为什么不直接安装Linux在主机 一直想深入学习一下linux的使用,于是将家里的笔记本装了linux系统,但是要将自己的系统打造一个适合开发的环境确实是一件 ...

随机推荐

  1. [SDOI2009]学校食堂Dining

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  2. 紧急疏散evacuate

    1689: [HNOI2007]紧急疏散evacuate 题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是".",那么表示这是一块空地 ...

  3. BZOJ3810: [Coci2015]Stanovi

    3810: [Coci2015]Stanovi Description Input 输入一行,三个整数,n, m, k   Output 输出一个数,表示最小不满意度.   Sample Input ...

  4. [POJ]1279: Art Gallery

    题目大意:有一个N边形展馆,问展馆内有多少地方可以看到所有墙壁.(N<=1500) 思路:模板题,半平面交求出多边形的核后计算核的面积. #include<cstdio> #incl ...

  5. hdu 5533(几何水)

    Input The first line contains a integer T indicating the total number of test cases. Each test case ...

  6. [bzoj1558][JSOI2009]等差数列

    题目:给定n个数,m个操作,每次给一段区间加一个等差数列或者询问一段区间至少要用多少个等差数列来表示.$n,m\leqslant 10^{5}$ 题解:老套路,维护差分数组,修改操作变成了两个单点加和 ...

  7. Elasticsearch 创建、更新、删除文档、处理冲突

    ----创建新文档---- 1._index,_type和_id的组合可以唯一标识一个文档,所以确保一个新文档的最简单的办法就是,使用索引请求的POST形式让elsticsearch自动生成唯一_id ...

  8. (转)SQL中的循环、for循环、游标

    我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加.修改.删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃 ...

  9. js打印小结

    <script type="text/javascript"> //打印必备参数 var hkey_root,hkey_path,hkey_key; hkey_root ...

  10. EF 6.x、EF Core实现dynamic动态查询和EF Core实现多个上下文实例池你了解多少?

    前言 很长一段时间没有写博客了,今天补上一篇吧,偶尔发现不太愿意写博客了,太耗费时间,不过还是在坚持当中,毕竟或许写出来的东西能帮到一些童鞋吧,接下来我们直奔主题.无论是在在EF 6.x还是EF Co ...