【转】 Pro Android学习笔记(七八):服务(3):远程服务: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文件的更多相关文章
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(八十):服务(5):访问远程服务
目录(?)[-] Client的AIDL文件 Client的代码 建立连接 请求服务 断开连接 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://bl ...
- 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...
- 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子
目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...
- 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib
目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...
- 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
目录(?)[-] 共享User ID的设置 共享资源例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...
- 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
目录(?)[-] 什么是lib项目 小例子 Lib的实现 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...
- 【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程
目录(?)[-] 主线程消息队列和线程池 查看线程信息 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingf ...
- 【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程
目录(?)[-] 类比例子 数字签名 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在W ...
- 【转】Pro Android学习笔记(八):了解Content Provider(下中)
在之前提供了小例子BookProvider,我们回过头看看如何将通过该Content Provider进行数据的读取. (1)增加 private void addBook(String name , ...
随机推荐
- 【转】linux驱动开发
转自:http://www.cnblogs.com/heat-man/articles/4174899.html 首先理一理驱动/内核/应用程序的一些概念,以前总没有具体的去关注过! 我们的pc直观来 ...
- springmvc-restful
1.restful概述 REST 仅仅是一种架构的风格,并不是真正的架构,也不是一个软件,而是一种思想. 我们可以基于现有的HTTP.URI.XML.等现有技术来实现REST的风格.而不用去学习任何新 ...
- 去除带有iframe页面中的2个滚动条[转]
方法一:加载frame时修改高度 <div> <iframe id="frame_content" name="frame_content&quo ...
- MapReduce-多个输出(使用MultipleOutput,不指定reduce任务个数)
多个输出 FileOutputFormat及其子类产生的文件放在输出目录下.每个reduce一个文件并且文件由分区号命名:part-r-00000,part-r-00001,等等.有时可能需要对输出的 ...
- mysqldump 用法汇总
mysql mysqldump 只导出表结构 不导出数据 复制代码代码如下: mysqldump --opt -d 数据库名 -u root -p > xxx.sql 备份数据库 复制代码代 ...
- VC读取文件内容
// chopper.cpp : Defines the entry point for the console application. // #include "stdafx.h&quo ...
- 最全面的linux信号量解析
信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程) 所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用, ...
- Python之print语句Python的注释
话不多说直接切入正题 print语句可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print 'hello, world' 注意: 1. ...
- JAVA 中的集合框架
java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 一.集合与数组 数组:(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知 ...
- tp后台注册登录配置项
1.在application目录下Common/Conf/config.php中 2-17行,首先判断在data目录下有没有特意设置的db.php, config.php,route.php,如果有就 ...