《安卓开发艺术探索》第二章 IPC机制—学习笔记

这个文集中文章主要是自己在学习中记录的重要知识点,方便日后查阅。

IPC简介

IPC:Inter-Process Communication 进程间通信或者跨进程通信
进程:在PC或者移动设备上一个程序或者应用,一个进程可以有多个线程
线程:是CPU调度的最小单元

Android里主线程也叫UI线程,只有在UI线程里才能操作界面元素

Android中多进程模式

Android中使用多进程只有一种方法:给四大组件在AndroidMenifest中指定android:process属性

多进程模式带来的问题

Android为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存的分配上是不同的地址空间。这就导致在不同的虚拟机中访问同一个对象会产生多个副本,所有运行在不同进程的四大组件,只要他们之间需要通过内存来共享数据,都会共享失败。这是多进程带来的影响。

多进程还会带下如下问题

  1. 静态成员和单例模式失效
  2. 线程同步机制完全失效
  3. SharedPreferences可靠性下降
  4. Application多次创建

IPC基础概念

1.Serializable接口

这是Java提供的序列化接口,可以通过ObjectOutputStreamObjectInputStream进行序列化和反序列化操作
注:通过Serializable进行序列化和反序列化的对象内容是完全一样的,但两者并不是同一个对象。

2.Parcelable

只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。系统中的Intent、Bundle、Bitmap等已经实现了该接口,可以直接序列化。Lsit、Map也可序列化,只要它们中的每个元素都是可以序列化的。

以上两种接口的异同

Serializable接口是Java中接口,使用简单开销大
Parcelable 接口是Android平台提供,使用略微复杂,效率高,优化使用此接口。
但是要是将对象序列化到设备或者用网络传输,过程就会稍显复杂,建议使用Serializable

3.Binder

Binder是Android实现Ibinder的一个类。
下面从不同角度来介绍Binder的概念:

  • IPC角度:是Android种跨进程通信的方式
  • 虚拟物理设备:设备驱动是/dev/binder
  • Android Framework角度:Binder是ServiceManager连接各种Manager和相应ManagerService的桥梁
  • Android应用层:是服务端和客户端通信的媒介。

Android中的IPC方式

1.使用Bundle

Activity、Service、Receiver都支持在Intent传递Bundle数据,由于Bundle实现了Parcelable接口,可以在不同进程中传输数据。

2.文件共享

就是第一个进程中将一个对象序列化到sd卡上的文件里,在第二个进程再将sd卡中的对象内容重新反序列化成对象。这两个对象是一样的,但本质上还是一个对象。
文件共享方式,适合对数据同步要求不高的进程间的通信,并要妥善处理并发读/写的问题。
不建议在进程间通信使用SharedPreferences,因为在高并发的读/写访问中,很容易会丢失数据。

3.使用Messenger

在Messenger中放入要传递的数据,就可以实现数据的进程间传递了,它的底层实现的是AIDL。

4.AIDL

(看的不是很清楚,待补充)

5.使用ContentProvider

这就是Android中提供的专门用于不同应用间数据共享的方式。其底层实现同样也是Binder。

6.使用Socket

简单来说就是通过网络通信,来实现跨进程通信。

Binder连接池

主要作用就是将每个业务模块的Binder请求统一转发到远程Service中,避免重复创建Service。

posted @ 2020-06-19 09:51  Cloud_9527  阅读(115)  评论(0编辑  收藏  举报