android之Service介绍之三 AIDL与传递对象

除了上一篇文章我们提到的通过service提供音乐播放等类似的服务之外,我们还可以通过service将对象传递回来哦,你知道怎么用吗,先看例子:

当我们点击“获取”时,会从另一个线程的service中获取一个对象,然后将里面的内容读出来。

--------------------------------------------------------------------------------------------

对于aidl实现以对象的方式交互。主要步骤如下:

 

 

服务端:

第一:定义一个实体类,这里是Beauty,定义一个服务接口aidl文件RemoteBeauty.aidl,这里有一点需要注意,我们引用自定义的实体类到aidl中时需要通过import导入包,但是你会发现,即使你导入了包,还是提示找不到,这时候,你要做的是,建一个以实体类名称命名的aidl文件,如Beauty.aidl,在里面添加一句pracelable Beauty。

第二:开始编写Beauty,这里一定要注意,它一定要实现Pracelable接口,该接口是一个序列化的接口,功能和serializable相似,但是功能更加的迅速。此外,在该Beauty内部一定要声明一个public static final Pracelable.Creator<T>CREATOR对象!!除了里面的那个T代表实体类之外,其他的都不准改变哦。

 

第三:在androidManifest.xml中注册service。并定义好访问该service的action字符串。

 

 

客户端:

客户端这边相应的要简单很多,但是要注意的一点是,要将实体类还有aidl文件都拷贝过来哦,而且要保证路径完全一致!!

 

-------------------------------------------------------------

代码示例:

服务端:

 

Beauty.java

 

 

[java:nogutter]  view plain copy
  1. package cn.com.chenzheng_java.service;  
  2.   
  3. import android.os.Parcel;  
  4. import android.os.Parcelable;  
  5. /** 
  6.  *  
  7.  * @author chenzheng_java 
  8.  * @description  Parcelable是android提供的一个比serializable效率更高的序列号接口 
  9.  *              这里必须要继承Parcelable哦,不序列号怎么可以传递……对吧?! 
  10.  * 在实体类我们要做两件重要的事情: 
  11.  * 第一:实现Parcelable接口 
  12.  * 第二:定义一个Parcelable.Creator类型的CREATOR对象 
  13.  * 第三:要提供一个Beauty.aidl文件,其中内容为parcelable Beauty,定义了之后,在其他aidl文件中引用Beauty时便不会提示出错了。 
  14.  * @since 2011/03/18 
  15.  * 
  16.  */  
  17. public class Beauty implements Parcelable {  
  18.   
  19.     String name ;  
  20.     int age ;  
  21.     String sex ;  
  22.       
  23.     public String getName() {  
  24.         return name;  
  25.     }  
  26.   
  27.     public void setName(String name) {  
  28.         this.name = name;  
  29.     }  
  30.   
  31.     public int getAge() {  
  32.         return age;  
  33.     }  
  34.   
  35.     public void setAge(int age) {  
  36.         this.age = age;  
  37.     }  
  38.   
  39.     public String getSex() {  
  40.         return sex;  
  41.     }  
  42.   
  43.     public void setSex(String sex) {  
  44.         this.sex = sex;  
  45.     }  
  46.   
  47.     @Override  
  48.     public int describeContents() {  
  49.         return 0;  
  50.     }  
  51.   
  52.     /** 
  53.      * 将对象序列号 
  54.      * dest 就是对象即将写入的目的对象 
  55.      * flags 有关对象序列号的方式的标识 
  56.      * 这里要注意,写入的顺序要和在createFromParcel方法中读出的顺序完全相同。例如这里先写入的为name, 
  57.      * 那么在createFromParcel就要先读name 
  58.      */  
  59.     @Override  
  60.     public void writeToParcel(Parcel dest, int flags) {  
  61.               
  62.             dest.writeString(name);  
  63.             dest.writeInt(age);  
  64.             dest.writeString(sex);  
  65.     }  
  66.     /** 
  67.      * 在想要进行序列号传递的实体类内部一定要声明该常量。常量名只能是CREATOR,类型也必须是 
  68.      * Parcelable.Creator<T> 
  69.      */  
  70.     public static final Parcelable.Creator<Beauty> CREATOR = new Creator<Beauty>() {  
  71.           
  72.         /** 
  73.          * 创建一个要序列号的实体类的数组,数组中存储的都设置为null 
  74.          */  
  75.         @Override  
  76.         public Beauty[] newArray(int size) {  
  77.             return new Beauty[size];  
  78.         }  
  79.           
  80.         /*** 
  81.          * 根据序列号的Parcel对象,反序列号为原本的实体对象 
  82.          * 读出顺序要和writeToParcel的写入顺序相同 
  83.          */  
  84.         @Override  
  85.         public Beauty createFromParcel(Parcel source) {  
  86.             String name = source.readString();  
  87.             int age = source.readInt();  
  88.             String sex = source.readString();  
  89.             Beauty beauty = new Beauty();  
  90.             beauty.setName(name);  
  91.             beauty.setAge(age);  
  92.             beauty.setSex(sex);  
  93.               
  94.             return beauty;  
  95.         }  
  96.     };  
  97.       
  98.       
  99.       
  100. }  

 

RemoteService.java

ServiceActivity.java

Beauty.aidl

[c-sharp]  view plain copy
  1. parcelable Beauty;  

RemoteBeauty.aidl

[java:nogutter]  view plain copy
  1. package cn.com.chenzheng_java.service;  
  2. import cn.com.chenzheng_java.service.Beauty;  
  3.  interface RemoteBeauty {  
  4.   
  5.     Beauty getBeauty();  
  6.       
  7. }  

manifest.xml

-------------------------------------

客户端:

ClientActivity.java

另外Beauty.java 以及RemoteBeauty.aidl都是从服务端系统中拷贝过来的哦。

 

 

 如果你想你的service在系统开机时自启动。可以在service的androidManifest.xml中加上这样的配置。

<receiver android:name=".StartBroadcastReceiver">

 

            <intent-filter>

   <action android:name="android.intent.action.BOOT_COMPLETED"/>

            </intent-filter>        

</receiver>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值