您的位置:首页 > 移动开发 > Android开发

android aidl 及binder 框架(一) Parcelable

2015-08-28 11:05 531 查看

(一)说明:

aidl :android interface define languge 是一种工具编译工具(在底层需要使用该工具将aidl文件转化为java文件,在eclipse当中会自动给我们生成java文件,在应用开发中可以忽略该行为),也是一种为了完成客户端绑定远程服务端后进行RPC的一种规范。

binder 框架:系统的纽带,在android系统中都是以提供服务的形式来让客户端完成特定工作。而客户端和服务端都运行在不同的进程当中,不同进程当中的地址空间是独立的,Binder框架就在他们之间负责完成IPC和RPC。

Parcelable : 是一个接口,需要完成序列化的对象都需要实现该接口。

 

要想完全理解和使用aidl,我们一步步学习从数据的序列化到Binder 框架的使用,后通过使用aidl 这一工具完成进程间通信的过程。

 

(二)Parceable 

 * Interface for classes whose instances can be written to

 * and restored from a {@link Parcel}.  Classes implementing the Parcelable

 * interface must also have a static field called <code>CREATOR</code>, which

 * is an object implementing the
{@link Parcelable.Creator Parcelable.Creator}

 * interface.

 

大意:实现该接口的类的实例可以被写入到Parcel包裹中,或者从Parcle包裹中恢复。实现该接口的类也必须拥有一个实现Parcleable.Creator 接口的一个名必须为CREATOR的静态域。

           可能有人不熟悉Parcle 这个类,在这里就理解为是一包裹,要想将对象序列化,都必须通过调用该类的对象的方法来进行操作。

 interface Parcelable{

 

    public int describeContents();

    

 

    public void writeToParcel(Parcel dest, int flags);

 

    public interface Creator<T> {

    public T createFromParcel(Parcel source);

      

    public T[] newArray(int size);     

    }

}

以上是摘自源码的部分代码,也是这里需要讲解的,其余部分代码可忽略,要实现序列化的对象必须实现以上方法。

实现接口的Parcelable 对象就可以被序列化到内存中,这样就可以增加进程间通信的性能。

 

下面来看一下如何完成某个对象到序列化:

package com.myservice;

import android.annotation.SuppressLint;

import android.os.Parcel;

import android.os.Parcelable;

public class MyParcel implements Parcelable {

 private int mData;

 private String mString;

 /**

  * 在createFromParcel 中还原对象的时候需要构造MyParcel对象

  * 将Parcel里面的值取出来 赋值给对象属性便还原了该对象

  * @param in

  */

 private MyParcel(Parcel in) {

  mData = in.readInt();

  mString = in.readString();

}

 @Override

 public int describeContents() {

  return 0;

 }

 /**

  * 将数据写进Parcel里面

  */

 @Override

 public void writeToParcel(Parcel out, int arg1) {

  out.writeInt(mData);

  out.writeString(mString);

}

 public static final Parcelable.Creator<MyParcel> CREATOR = new Parcelable.Creator<MyParcel>() {

  

  @Override

  public MyParcel createFromParcel(Parcel in) {

    return new MyParcel(in);

  }

  @Override

  public MyParcel[] newArray(int size) {

   return new MyParcel[size];

  }

 };

}

以后便完成了一个对象的序列化。现在我们来讲解每个方法的作用:

 

    /**

     * Describe the kinds of special objects contained in this Parcelable's

     * marshalled representation.

     * 

     * @return a bitmask indicating the set of special object types marshalled

     * by the Parcelable.

     */

  public int describeContents()

  源码中注释的意思是返回一个位掩码指示一组被Parcelable 安排的特殊对象。读了半天没搞懂。

  看了官方文档中也没有很好的解释,希望知道的大牛可以告诉我。以后我知道答案后也会在博客中写出来。

  这里万众人都说返回 0 就ok了,我们按返回0. 一样可以完成功能,可能报保存其他特殊对象的时候需要吧。

 

  public void writeToParcel(Parcel out, int flags)

  这个方法就明显多了,这个函数主要就是将数据写进去,注意数据写入的顺序!!读取的时候需要按顺序将数据读的!!

  out 第一个参数就是提供给我们的一个包裹对象,通过该对象就可以将需要通信的对象或者值写进包裹里面去,参数名为out意思就是丢出去嘛。

  flags 是一个标志,取值为0或者1,一般不管

 

   public static final Parcelable.Creator<MyParcle>CREATOR 中的两个函数

   public MyParcelable createFromParcel(Parcel in);

  这个函数是在反序列化的时候需要使用,此时in 这个包裹里面已经装载了我们的存入的数据,所以直接按顺序取出来,我们这里是在MyParcel的构造方法里面取出来的,取出来后便可以构造出一个完全一样的MyParcel对象。

 

  public MyParcelable[] newArray(int size)

  就是返回一个该MyParcle类的数组,

 

总结:

    Parcleble 是一个接口,这个接口通过Parcle告诉系统怎样写入数据和读出数据,以完成序列化和反序列化。Parcle只是一个包裹,这个包裹已经被规定了怎样放东西和怎样取东西,因此要实现进程间的通信还需要使用Binder框架。

 

 

 

  

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息