当前位置:操作系统 > 安卓/Android >>

android AIDL服务

android的本地服务:它只能由承载它的应用程序使用。现在我们将介绍如何构建可由其他进程通过 RPC 使用服务。与许多其他基于 RPC 的解决方案一样,在Android中,需要使用 IDL来定义将向客户端公开的接口。在Android中,这个 IDL 称为 AIDL。要构建远程服务,执行以下步骤。
  (1)编写一个AIDL文件来向客户端定义接口。AIDL 文件使用 java语法,它的扩展名是点 .aidl 使用的包名称与Android项目所使用的包相同。
   (2)将AIDL 文件添加到项目的任意包下。Android Eclipse 插件将调用AIDL编译器来从 AIDL 文件生成 Java接口。
上边这2步说白了就是  你自己随便定义一个文件 扩展名是 .aidl 然后将这个文件复制到你的包下面,那个包都可以。然后 Android Eclipse 插件会自动帮你 根据这个 AIDL 文件生成 Java文件。
    (3)实现一个服务并从 onBind()方法返回所生成的接口。
    (4)将服务配置添加到 AndroidManifest.xml文件中。
   
     在AIDL中定义服务接口
   为了展示远程服务实例,我们将编写一个股票报价服务。此服务将提供一种方法来获取股票代号并返回价格。要在Android 中编写远程服务,第一步是在 AID文件中定义服务的接口。
   股票报价服务的 AIDL 定义


[java] 1.//This file is IStockQuoteService.aidl     
2.package com.androidbook.stockquoteservice;    
3.interface IStockQuoteService    
4.{    
5.    double getQuote(String ticker);    
6.} 
1.//This file is IStockQuoteService.aidl  
2.package com.androidbook.stockquoteservice;  
3.interface IStockQuoteService  
4.{  
5.    double getQuote(String ticker);  
6.}

IStockQuoteService 以字符串的形式接受股票代号,并以双精度数字形式返回当前的股票价值。当创建AIDL文件时, Android Eclipse插件将运行 AIDL 编译器来处理 AIDL文件(在构建过程中)。如果AIDL文件成功编译,编译器将生成一个适合 RPC 通信的 Java接口。请注意,生成的文件将位于在 AIDL文件中指定的包中,在本例中为 com.androidbook.stockquoteservice。
  下面是为 IStockQuoteService接口生成的Java文件。生成的文件将放在Eclipse的 gen文件夹中。


[java] 1./*  
2. * This file is auto-generated.  DO NOT MODIFY.  
3. * Original file: F:\\workspace\\StockQuoteService\\src\\com\\androidbook\\stockquoteservice\\IStockQuoteService.aidl  
4. */   
5.package com.androidbook.stockquoteservice;    
6.public interface IStockQuoteService extends android.os.IInterface    
7.{    
8./** Local-side IPC implementation stub class. */   
9.public static abstract class Stub extends android.os.Binder implements com.androidbook.stockquoteservice.IStockQuoteService    
10.{    
11.private static final java.lang.String DESCRIPTOR = "com.androidbook.stockquoteservice.IStockQuoteService";    
12./** Construct the stub at attach it to the interface. */   
13.public Stub()    
14.{    
15.this.attachInterface(this, DESCRIPTOR);    
16.}    
17./**  
18. * Cast an IBinder object into an com.androidbook.stockquoteservice.IStockQuoteService interface,  
19. * generating a proxy if needed.  
20. */   
21.public static com.androidbook.stockquoteservice.IStockQuoteService asInterface(android.os.IBinder obj)    
22.{    
23.if ((obj==null)) {    
24.return null;    
25.}    
26.android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);    
27.if (((iin!=null)&&(iin instanceof com.androidbook.stockquoteservice.IStockQuoteService))) {    
28.return ((com.androidbook.stockquoteservice.IStockQuoteService)iin);    
29.}    
30.return new com.androidbook.stockquoteservice.IStockQuoteService.Stub.Proxy(obj);    
31.}    
32.public android.os.IBinder asBinder()    
33.{    
34.return this;    
35.}    
36.@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException    
37.{    
38.switch (code)    
39.{    
40.case INTERFACE_TRANSACTION:    
41.{    
42.reply.writeString(DESCRIPTOR);    
43.return true;    
44.}    
45.case TRANSACTION_getQuote:    
46.{    
47.data.enforceInterface(DESCRIPTOR);    
48.java.lang.String _arg0;    
49._arg0 = data.readString();    
50.double _result = this.getQuote(_arg0);    
51.reply.writeNoException();    
52.reply.writeDouble(_result);    
53.return true;    
54.}    
55.}    
56.return super.onTransact(code, data, reply, flags);    
57.}    
58.private static class Proxy implements com.androidbook.stockquoteservice.IStockQuoteService    
59.{    
60.private android.os.IBinder mRemote;    
61.Proxy(android.os.IBinder remote)    
62.{    
63.mRemote = remote;    
64.}    
65.public android.os.IBinder asBinder()    
66.{    
67.return mRemote;    
68.}    
69.public java.lang.String getInterfaceDescriptor()    
70.{    
71.return DESCRIPTOR;    
72.}    
73.public double getQuote(java.lang.String ticker) throws android.os.RemoteException    
74.{    
75.android.os.Parcel _data = android.os.Parcel.obtain();    
76.android.os.Parcel _reply = android.os.Parcel.obtain();    
77.double _result;    
78.try {    
79._data.writeInterfaceToken(DESCRIPTOR);    
80._data.writeString(ticker);    
81.mRemote.transact(Stub.TRANSACTION_getQuote, _data, _reply, 0);    
82._reply.readException();    
83._result = _reply.readDouble();    
84.}    
85.finally {    
86._reply.recycle();    
87._data.recycle();    
88.}    
89.return _result;    
90.}    
91.}    
92.static final int TRANSACTION_getQuote = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);    
93.}    
94.public double get

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,