小菜毛毛技术分享

与大家共同成长

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

8.4.2  建立AIDL服务的步骤(2)

在编写上面代码时应注意如下两点:

使用bindService方法来绑定AIDL服务。其中需要使用Intent对象指定AIDL服务的ID,也就是<action>标签中android:name属性的值。

在绑定时需要一个ServiceConnection对象。创建ServiceConnection对象的过程中如果绑定成功,系统会调用onServiceConnected方法,通过该方法的service参数值可获得AIDL服务对象。

首先运行AIDL服务程序,然后运行客户端程序,单击【绑定AIDL服务】按钮,如果绑定成功,【调用AIDL服务】按钮会变为可选状态,单击这个按钮,会输出getValue方法的返回值,如图8.26所示。

 
图8.26  调用AIDL服务的客户端程序

实例53:传递复杂数据的AIDL服务

AIDL服务工程目录:src\ch08\ch08_complextypeaidl

客户端程序工程目录:src\ch08\ch08_complextypeaidlclient

AIDL服务只支持有限的数据类型,因此,如果用AIDL服务传递一些复杂的数据就需要做更一步处理。AIDL服务支持的数据类型如下:

Java的简单类型(int、char、boolean等)。不需要导入(import)。

String和CharSequence。不需要导入(import)。

List和Map。但要注意,List和Map对象的元素类型必须是AIDL服务支持的数据类型。不需要导入(import)。

AIDL自动生成的接口。需要导入(import)。

实现android.os.Parcelable接口的类。需要导入(import)。

其中后两种数据类型需要使用import进行导入,将在本章的后面详细介绍。

传递不需要import的数据类型的值的方式相同。传递一个需要import的数据类型的值(例如,实现android.os.Parcelable接口的类)的步骤略显复杂。除了要建立一个实现android.os.Parcelable接口的类外,还需要为这个类单独建立一个aidl文件,并使用parcelable关键字进行定义。具体的实现步骤如下:

(1)建立一个IMyService.aidl文件,并输入如下代码:

  1. package net.blogjava.mobile.complex.type.aidl;  
  2. import net.blogjava.mobile.complex.type.aidl.Product;  
  3. interface IMyService    
  4. {    
  5.     Map getMap(in String country, in Product product);  
  6.     Product getProduct();       

在编写上面代码时要注意如下两点:

Product是一个实现android.os.Parcelable接口的类,需要使用import导入这个类。

如果方法的类型是非简单类型,例如,String、List或自定义的类,需要使用in、out或inout修饰。其中in表示这个值被客户端设置;out表示这个值被服务端设置;inout表示这个值既被客户端设置,又被服务端设置。

(2)编写Product类。该类是用于传递的数据类型,代码如下:

  1. package net.blogjava.mobile.complex.type.aidl;  
  2.  
  3. import android.os.Parcel;  
  4. import android.os.Parcelable;  
  5.  
  6. public class Product implements Parcelable  
  7. {  
  8.     private int id;  
  9.     private String name;  
  10.     private float price;  
  11.     public static final Parcelable.Creator<Product>
     CREATOR = new Parcelable.Creator<Product>()  
  12.     {  
  13.         public Product createFromParcel(Parcel in)  
  14.         {  
  15.             return new Product(in);  
  16.         }  
  17.  
  18.         public Product[] newArray(int size)  
  19.         {  
  20.             return new Product[size];   
  21.         }  
  22.     };  
  23.     public Product()  
  24.     {  
  25.     }  
  26.     private Product(Parcel in)  
  27.     {  
  28.         readFromParcel(in);  
  29.     }  
  30.     @Override  
  31.     public int describeContents()  
  32.     {  
  33.         return 0;  
  34.     }  
  35.     public void readFromParcel(Parcel in)  
  36.     {  
  37.         id = in.readInt();  
  38.         name = in.readString();  
  39.         price = in.readFloat();  
  40.     }  
  41.     @Override  
  42.     public void writeToParcel(Parcel dest, int flags)  
  43.     {  
  44.         dest.writeInt(id);  
  45.         dest.writeString(name);  
  46.         dest.writeFloat(price);  
  47.     }  
  48.     //  此处省略了属性的getter和setter方法  
  49.     ... ...  

在编写Product类时应注意如下3点:

Product类必须实现android.os.Parcelable接口。该接口用于序列化对象。在Android中之所以使用Pacelable接口序列化,而不是java.io.Serializable接口,是因为Google在开发Android时发现Serializable序列化的效率并不高,因此,特意提供了一个Parcelable接口来序列化对象。

在Product类中必须有一个静态常量,常量名必须是CREATOR,而且CREATOR常量的数据类型必须是Parcelable.Creator。

在writeToParcel方法中需要将要序列化的值写入Parcel对象。

(3)建立一个Product.aidl文件,并输入如下内容:

  1. parcelable Product; 
posted on 2010-11-19 16:58 小菜毛毛 阅读(548) 评论(0)  编辑  收藏 所属分类: andriod

只有注册用户登录后才能发表评论。


网站导航: