【Android开发艺术探索】IPC机制(二)

为了更好的学习IPC跨进程通讯技术,介绍一些相关概念。

  • 序列化原因:
    • 永久性保存对象,保存对象的字节序列到本地文件中;
    • 通过序列化对象在网络中传递对象;
    • 通过序列化在进程间传递对象。
  • Serializable接口

    • 是Java提供的一个序列化空接口,使用相当方便,只需实现这个接口并且指定private static final long serialVersionUID = 1L的数值,如果不指定的话反序列化会受到影响。因为序列化的时候系统会把serialVersionUID写入序列化文件的(也可能是其他介质);反序列化的时候会检测这个值 ,不一样的话就会反序列化失败。
    • 静态变量不属于类的内容,不参与序列化、反序列化
    • transient标示的关键字不参与反序列化和序列化。序列化和反序列化之后对象内容一样,但是并不是一个对象。
    • 如果类结构发生毁灭性的变化,反序列化会失败,比如说成员变量类型发生变化,修改了类名等(新增加或减少了成员变量由于serialVersionUID 的存在会反序列化成功)。
    • 序列化过程

      Book book = new Book("张三",21);
                  ObjectOutputStream os = null;
                  try {
                      os = new ObjectOutputStream(new FileOutputStream("cache.txt"));
                      os.writeObject(book);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }finally {
                      try {
                          if (os!=null)
                          os.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
    • 反序列化过程

      ObjectInputStream is = null;
                  try {
                      is = new ObjectInputStream(new FileInputStream("cache.txt"));
                      book= (Book) is.readObject();
                  } catch (Exception e) {
                      e.printStackTrace();
                  } finally {
                      try {
                          if (is!=null)
                              is.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
  • Parcelable接口

    • 实现这个接口,就能实现序列化,通过Intent和Binder传递这里写图片描述
    • serializable和parcelable的区别
      • 在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
      • Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
      • Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
  • Binder类(IBinder的实现类)

    • 理解为一种虚拟的物理设备,设备驱动是/dev/binder
    • 从Applications层来讲,Binder是客户端和服务端(不是我们理解的那个Http请求的服务器端,是指IPC的时候a进程访问b进程中的东西,这时候b进程就是服务端)进行通信的媒介。当bindeService的时候返回一个Binder对象,客户端就会得到服务端提供的服务(普通的服务和AIDL服务)和数据。
    • 从Framework层面来讲,Binder是ServiceManager连接各种Manager(ActivityManager,WindowManager…)和相应ManagerService层的桥梁。
  • Binder在Android开发中主要应用于Service中,包括AIDL和Messenger。普通Service的Binder不涉及IPC进程间通信,比较简单。Messenger的底层其实就是AIDL,所以这里我们利用AIDL来分析Binder机制。需要明确的是AIDL只是一个为了快速实现binder的产物,而不是一个必需品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值