Android系统中,各应用程序都运行在自己的进程中,进程之间无法直接进行数据交换。为了实现这种跨进程通信(interprocess communication,简称IPC),Android提供了AIDL Service

AIDL Service简介

Android的远程Service调用与java的RMI基本相似,一样都是先定义一个远程调用接口,然后为该接口提供一个实现类即可。客户访问Service时,Android并不是直接返回Service对象给客户端,而是通过onBind()方法返回一个IBinder类型的对象作为Service的代理对象给客户端。因此,AIDL远程接口的实现类就是IBinder的实现类。
与绑定本地Service不同的是,绑定本地Service,onBind会直接把IBinder的实现类传给客户端的ServiceConnection的onServiceConnected方法的第二个参数;而绑定远程Service则是将IBinder对象的代理传给ServiceConnection的onServiceConnected方法的第二个参数。
当客户端获取了远程service的IBinder对象的代理后,接下来就可以通过该IBinder对象去回调远程Service的属性或方法了。

实现步骤:

1、创建AIDL文件
Android需要AIDL(Android Interface Definition Language)来定义远程接口
利用Android studio创建AIDL接口后,会自动为接口生成实现(但是我用的Android Studio1.4在创建了.aidl文件后并没有自动生成.java文件,要run一遍项目后才会生成),生成的java文件在app\build\generated\source\aidl\debug\目录下

interface ICat {    /**     * Demonstrates some basic types that you can use as parameters     * and return values in AIDL.     */            String getColor();            double getWeight();}

自动生成的java文件中,有这样一个Stub类,它继承了android.os.Binder,所以Service的onBind方法可以将继承了Stub的类的对象传给客户端

public static abstract class Stub extends android.os.Binder{}

2、将接口暴露给客户端

在Service中,根据业务要求实现ICat接口

 public class CatBinder extends ICat.Stub {        @Override        public String getColor() throws RemoteException {            return "red";        }        @Override        public double getWeight() throws RemoteException {            return 55;        }    }

这里只是简单的传递两个数据
创建ICat对象,通过onBind方法传给客户端

ICat ICat = new ICat();@Overridepublic IBinder onBind(Intent arg0){    return ICat;}

3、客户端接收代理对象
和绑定本地Service一样,都是通过ServiceConnection的onServiceConnected来获取,但是有一点不一样
①:将Service端.iadl文件生成的.java文件连同包一同复制到客户端项目中
②:onServiceConnected()方法获得对象的代理方法为:

catService = ICat.Stub.asInterface(service);

获取到代理对象后,就可以通过它来回调Service中实现的方法了

更多相关文章

  1. [置顶] Android中数据存储的5种方法
  2. Android webview与js交换JSON对象数据示例
  3. 基于RTP和Android的视频传输的研究实现方法
  4. Android 中.aar文件生成方法与用法
  5. Android Studio中获取sha1证书的方法
  6. android 退出程序三种方法及两种形式
  7. 【android】五种控制Android应用的权限的方法
  8. 2011.06.07(2)——— android 调试android源码包下的package应用的

随机推荐

  1. 高德地图api接口poi检索示例----并在信息
  2. 六步使用ICallbackEventHandler实现无刷
  3. JavaScript学习笔记--语法
  4. 在指定的div - js内按id计算div的数量
  5. 寻找解决方案,以每100速率1显示div随机而
  6. AngularJs在模态中注入模板html
  7. 在传递给google.setOnLoadCallback()的函
  8. 记12306货运系统“抢订空车”插件的编写-
  9. 在鼠标悬停事件中使用Javascript隐藏内容
  10. 【W3s学JSON】JSON入门概念学习笔记 _W3s