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

RemoteService.java

ServiceActivity.java

Beauty.aidl

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

RemoteBeauty.aidl

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

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、付费专栏及课程。

余额充值