目录(?)[-]

  1. 在AIDL中定义服务接口
  2. 根据AIDL文件自动生成接口代码

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/

Remote Service在之前的学习笔记 Android学习笔记(五三):服务Service(下)- Remote Service中介绍过。远程服允许行其他应用调用,及允许RPC(remote procedure call)。在Android中remote需要通过ADIL(Android interface definition Language)定义开放给client的接口。建立远程服务需要一下步骤:

1、编写AIDL文件来定义向client开放的接口,并将AIDL文件加到项目src/目录下。

2、实现service,在onBind()中返回接口

3、在AndroidManifest.xml中配置service。

在AIDL中定义服务接口

我们将通过一个简单小例子也学习。例子很简单,远程服务模拟股指报价,给出请求,回复股价。我们将是src/目录下,即在我们增加java code的地方,加入一个IStockQuoteSerice.aidl文件,AIDL文件采用java语法,文件中的包名就是项目的包名。

package cn.wei.flowingflying.proandroidservice;

interface IStockQuoteService
    double getQuote(String ticker); 
}

根据AIDL文件自动生成接口代码

在编译之后,系统会根据aidl文件生成相应的IStockQuoteService.java文件,将接口以java的方式表达出来。Android对于一些复杂的接口,为了开发者使用便捷,自动生成相应的java文件。

我们来看看自动生成的接口文件IStockQuoteService.java。自动生成代码的缩退没有那么好看,利用eclipse的聚合功能,IStockQuoteService中含有两部分,一个是class stub,另一个是我们在aidl中定义的接口函数getQuote()。

/* 根据我们在aidl文件中对接口interface IStockQuoteService{}的定义,自动生成接口代码IStockQuoteService
* This file is auto-generated.  DO NOT MODIFY. 
* Original file: ...\\src\\cn\\wei\\flowingflying\\proandroidservice\\IStockQuoteService.aidl
*/ 
package cn.wei.flowingflying.proandroidservice;/*这就是为何aidl中的package名字要和project的一致*/
public interface IStockQuoteService extends android.os.IInterface


/** 有一个抽象类Stub集成Binder,而同时实现IStockQuoteService。Stub在远程服务中很关键,当client连接server,即bindService()时,server返回一个Stub对象,由于stub实现接口,client可以通过这个对象来访问接口.Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements cn.wei.flowingflying.proandroidservice.IStockQuoteService

private static final java.lang.String DESCRIPTOR = "cn.wei.flowingflying.proandroidservice.IStockQuoteService";
/** Construct the stub at attach it to the interface. */ 
public Stub() { ... ...} 
/** Cast an IBinder object into an cn.wei.flowingflying.proandroidservice.IStockQuoteService interface, generating a proxy if needed. */
public static cn.wei.flowingflying.proandroidservice.IStockQuoteService asInterface(android.os.IBinder obj) { … … }
@Override public android.os.IBinder asBinder() { … … } 
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { … … }
/* Proxy是Stub的内部类,实现IStockQuoteService接口,对接口中的getQuote()做了具体的实现*/ 
private static class Proxy implements cn.wei.flowingflying.proandroidservice.IStockQuoteService


… … 
/*这是在class stub中对getQuote()的实现,具体的代码没看懂,可以理解为service和stub之间对getQuote()的结果的传递,可得到service的getQuote()的结果*/
@Override public double getQuote(java.lang.String ticker) throws android.os.RemoteException
{
 
android.os.Parcel _data = android.os.Parcel.obtain(); 
android.os.Parcel _reply = android.os.Parcel.obtain(); 
double _result; 
try { 
_data.writeInterfaceToken(DESCRIPTOR); 
_data.writeString(ticker); 
mRemote.transact(Stub.TRANSACTION_getQuote, _data, _reply, 0); 
_reply.readException(); 
_result = _reply.readDouble(); 

finally { 
_reply.recycle(); 
_data.recycle(); 

return _result; 

} 
static final int TRANSACTION_getQuote = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);

public double getQuote(java.lang.String ticker) throws android.os.RemoteException;
}

本笔记涉及的例子代码,可以在Pro Android学习:Android service小例子中下载。

相关链接: 我的Android开发相关文章

【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件的更多相关文章

  1. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  2. 【转】 Pro Android学习笔记(八十):服务(5):访问远程服务

    目录(?)[-] Client的AIDL文件 Client的代码 建立连接 请求服务 断开连接 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://bl ...

  3. 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...

  4. 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子

    目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...

  5. 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib

    目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...

  6. 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享

    目录(?)[-] 共享User ID的设置 共享资源例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...

  7. 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目

    目录(?)[-] 什么是lib项目 小例子 Lib的实现 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...

  8. 【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程

    目录(?)[-] 主线程消息队列和线程池 查看线程信息 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingf ...

  9. 【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程

    目录(?)[-] 类比例子 数字签名 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在W ...

  10. 【转】Pro Android学习笔记(八):了解Content Provider(下中)

    在之前提供了小例子BookProvider,我们回过头看看如何将通过该Content Provider进行数据的读取. (1)增加 private void addBook(String name , ...

随机推荐

  1. mysql服务性能优化 my.cnf my.ini配置说明详解(16G内存)

    sort_buffer_size,join_buffer_size,read_buffer_size参数对应的分配内存也是每个连接独享 这配置已经优化的不错了,如果你的mysql没有什么特殊情况的话, ...

  2. File类之在指定目录中查找文件

    package IoDemo; import java.io.File; /** * @Title:FileDemo2 * @Description:在指定的目录中查找文件 * @author Cra ...

  3. 阅读linux内核代码的工具-- Source Insight

    http://blog.csdn.net/luckyaslan/article/details/7869235 Step 1:安装Source Insight并启动程序 可以进入图1界面,在工具条上有 ...

  4. Use default arguments instead of short circuiting or conditionals使用默认实参代替短路和条件

  5. 安装rackspace private cloud --3 Deployment host

    on deploy host: 在deploy host上安装 Ubuntu Server 14.04 (Trusty Tahr) LTS 64-bit # apt-get install aptit ...

  6. Oracle中的BLOB和CLOB【转载】

    原文地址:http://jelly.iteye.com/blog/65796 一.区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多 ...

  7. JavaScript 全部介绍

     1.new 表达式  new之后写函数名的话,就会把该函数作为构造函数来进行调用.   2.字符串型的运算  由于JavaScript的字符串型是不可变类型,所以字符串值本质上是不能改变的.这个答案 ...

  8. 2017-03-04 dotnet core网站发布到Linux系统中

    今天开始学习dotnet core的开发,距离Visual Stuio 2017正式版的发布,也就是VS20周岁的生日还有三天,在我的电脑上安装的是VS2017 Enterprise RC版, 在VS ...

  9. jsonp 解决跨域传输

    JSONP是JSON with Padding的略称.它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅 ...

  10. Token和session 详解

    Token的含义 原文链接 这只是一个思路 1.Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在 ...