您的位置:首页 > 其它

IPC机制

2016-02-25 21:18 190 查看
最近在读《Android开发艺术探索》这本书,读到了《IPC机制》这一章,很有感触,故在这里做笔记,用作自己记录之用。

简介

IPCInter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。进程间通信的方式有:Bundle、文件共享、AIDL、Messenger、ContentProvider和Socket等。

线程是CPU调度的最小单元,同时线程是一种有限的系统资源。

进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。

一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。最简单的情况下,一个进程中只可以有一个线程,即主线程,也叫UI线程。

IPC不是Android中所独有的,任何一个操作系统都需要相应的IPC机制,比如Windows上可以通过剪贴板等来进行进程间通信。Android是一种基于Linux内核的移动操作系统,它的进程间通信方式并不能完全继承自Linux,相反,它有自己的进程间通信方式。在Android中最有特色的进程间通信方式就是Binder了。

Android中的多进程模式

通过给四大组件指定android:process属性,我们可以轻易地开启多进程模式。但是多进程也会带来很多负面影响,有时候我们通过多进程得到的好处甚至都不足以弥补使用多进程所带来的代码层面的负面影响。

1.开启多进程模式

首先,在Android中使用多进程只有一种方法,那就是四大组件指定android:process。除此之外没有其它办法,也就是我们无法给一个线程或者一个实体类指定其运行时所在的进程。(详见P37)

android:process属性为”:remote”,也有可能是”com.ci.remote”,这两种方法是有明显区别的。(P38)第一方面,”:”的含义是指要在当前的进程名前附加上当前的包名,这是一种简写的方法,而”com.ci.remote”就是完整的命名信息。第二方面,进程名以”:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中;而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。

2.多进程模式的运行机制

在P39页有一个例子,就是静态变量在多个进程中可能不再是同一个“它自己”了(详见P39)。在一个进程中改变一个静态变量的值之后,可能在另一个进程中打印我们的静态变量还是原来的值,并没有发生改变。在Android中,每个进程都被分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。

综合来说,使用多进程会造成如下几方面的问题:

(1)静态成员和单例模式完全失效。

(2)线程同步机制完全失效。

(3)SharedPreferences的可靠性下降。

(4)Application会多次创建。

IPC基础概念介绍

Serializable和Parcelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable。

1.Serializable接口(代码详见P42)

Serializable是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。具体的描述在P42,在这里我就是写一个提纲,并不细述了。

2.Parcelable接口

Parcelable也是一个接口,只要实现这个接口,一个类的对象就可以了实现序列化并可以通过Intent和Binder传递。(详情见P46)

两者的区别是:Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。而Parcelable是Android中的序列化方式,因此更适合用在Android平台上,它的缺点是使用起来稍微有点麻烦,但是它的效率很高,这是Android推荐的序列化方式,因此我们首选Parcelable。

以上就是我对于IPC的一些基础知识所列的提纲,具体的代码只是标记了页数,以供自己查阅。并且任玉刚大神的代码也是存放在他的Github上的,如果看见了可以去他的主页查阅。通过阅读和做笔记,我对于IPC有了一个基本的认识,后面就是对于Binder的认识以及具体的IPC方式。如果有时间的话,我也会把自己的体会通过笔记记录下来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: