Android高手进阶教程(二十五)之---…

http://blog.csdn.net/android_tutor/article/details/6427680

大家好,好久不见,今天要给大家分享的是android aidl的使用。在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.  


AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.  

AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.  

 

今天的两个实例用到两个Android工程,一个是AIDL的服务端另一个是客户端。

 

服务端的实现步骤:

首先看一下服务端,工程目录如下:

首先创建IaidlServerService.aidl文件,代码如下(一个简单方法,另一个返回对象方法),当我们点击保存时会在gen目录下生成对应的java文件,如上图红色部分:

 

[java] view plain copy
  1. package com.chapter8.aidl;  
  2. import com.chapter8.aidl.Book;  
  3. interface IAIDLServerService   
  4.       
  5.     String sayHello();  
  6.       
  7.     Book getBook();  
  8.  
 

第二步:因为这个接口里有传递对象,所以对象要特殊处理一下,这里继承了Parcelable,Book.java代码如下:

如果大家不明的地方,请参见,下面连接的文章:

Android高手进阶教程(十七)之---Android中Intent传递对象的两种方法(Serializable,Parcelable)!

[java] view plain copy
  1. package com.chapter8.aidl;  
  2. import android.os.Parcel;  
  3. import android.os.Parcelable;  
  4. public class Book implements Parcelable  
  5.       
  6.     private String bookName;  
  7.     private int bookPrice;  
  8.       
  9.     public Book(){  
  10.           
  11.      
  12.       
  13.     public Book(Parcel parcel){  
  14.         bookName parcel.readString();  
  15.         bookPrice parcel.readInt();  
  16.      
  17.       
  18.     public String getBookName()  
  19.         return bookName;  
  20.      
  21.     public void setBookName(String bookName)  
  22.         this.bookName bookName;  
  23.      
  24.     public int getBookPrice()  
  25.         return bookPrice;  
  26.      
  27.     public void setBookPrice(int bookPrice)  
  28.         this.bookPrice bookPrice;  
  29.      
  30.       
  31.     public int describeContents()  
  32.         return 0;  
  33.      
  34.     public void writeToParcel(Parcel parcel, int flags)  
  35.         parcel.writeString(bookName);  
  36.         parcel.writeInt(bookPrice);  
  37.      
  38.       
  39.     public static final Parcelable.Creator CREATOR new Creator()  
  40.         public Book createFromParcel(Parcel source)  
  41.               
  42.             return new Book(source);  
  43.          
  44.         public Book[] newArray(int size)  
  45.             return new Book[size];  
  46.          
  47.     };  
  48.  
 

第三步:写一个与Book类对应的aidl,命名为Book.aidl,代码非常简单,代码如下:

[java] view plain copy
  1. parcelable Book;  
 

第四步:新建一个名为AidlServerService的Service.代码如下:

[java] view plain copy
  1. package com.chapter8.aidl;  
  2. import com.chapter8.aidl.IAIDLServerService.Stub;  
  3. import com.chapter8.aidl.IAIDLServerService;  
  4. import android.app.Service;  
  5. import android.content.Intent;  
  6. import android.os.IBinder;  
  7. import android.os.RemoteException;  
  8. public class AidlServerService extends Service  
  9.     @Override  
  10.     public IBinder onBind(Intent intent)  
  11.         return mBinder;  
  12.      
  13.        
  14.     private IAIDLServerService.Stub mBinder new Stub()  
  15.           
  16.         public String sayHello() throws RemoteException  
  17.             return "Hello";  
  18.          
  19.           
  20.         public Book getBook() throws RemoteException  
  21.             Book mBook new Book();  
  22.             mBook.setBookName("Android应用开发");  
  23.             mBook.setBookPrice(50);  
  24.             return mBook;  
  25.          
  26.     };  
  27.  
 

第五步:在AndroidManifest.xml注册Service,代码如下:

[java] view plain copy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值