1 IPC简介
IPC的含义是进程间通信,或者跨进程通信。
区分进程和线程
进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
线程:程序执行的最小单元,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源
不同于管道信号量消息邮箱,android中的IPC就是Binder了,另外android还支持Socket通信。
2 android中的多进程模式
2.1 开启多进程模式
通过给四大组件在AndroidMenifest.xml指定android:process属性,我们可以轻易的开启多进程模式。但是多进程模式有很多负面影响。
android:process = ":remote"//私有进程,属于当前包。
android:process = "com.tijun.test:remote"//全局进程,其他应用通过ShareUID和他泡在同一个进程中
2.2 多进程模式的运行机制
android为每一个应用/进程都分配了独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,所以在不同的虚拟机中访问同一个对象会产生多个副本。所以进程一中的全局变量和进程二中的不同。
所有运行在不同进程中的四大组件,只要他们之间通过内存在共享数据,都会共享失败,这就是多进程带来的主要影响。正常情况下四大组件它能够通过一些中间层来共享数据。
所以一般来说,多进程会出现一下几种问题
- 静态成员和单列完全失效。
- 线程同步机制完全失效(锁定操作失效)
- SharedPreference的可靠性下降(不支持两个进程同时文件操作)
- Application会多次创建
所以我们需要IPC
3 IPC基础概念介绍
3.1 Serializable 接口
它是java所提供的一个序列化接口
// access modifiers, accessors and constructors omitted for brevity
public class SerializableDeveloper implements Serializable{
String name;
int yearsOfExperience;
List<Skill> skillSet;
float favoriteFloat;
static class Skill implements Serializable {
String name;
boolean programmingRelated;
}
}
SerializableDeveloper 对象就是一个已经序列化的对象,我们可以把它放到Intent或者写入文件流
反序列化的时候,个图SerillizableExtra,或者readObject等方法
serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。
这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
3.2 Pracelable
// access modifiers, accessors and regular constructors ommited for brevity
class ParcelableDeveloper implements Parcelable {
String name;
int yearsOfExperience;
List<Skill> skillSet;
float favoriteFloat;
ParcelableDeveloper(Parcel in) {
this.name = in.readString();
this.yearsOfExperience = in.readInt();
this.skillSet = new ArrayList<Skill>();
in.readTypedList(skillSet, Skill.CREATOR);
this.favoriteFloat = in.readFloat();
}
void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(yearsOfExperience);
dest.writeTypedList(skillSet);
dest.writeFloat(favoriteFloat);
}
int describeContents() {
return 0;
}
static final Parcelable.Creator<ParcelableDeveloper> CREATOR
= new Parcelable.Creator<ParcelableDeveloper>() {
ParcelableDeveloper createFromParcel(Parcel in) {
return new ParcelableDeveloper(in);
}
ParcelableDeveloper[] newArray(int size) {
return new ParcelableDeveloper[size];
}
};
static class Skill implements Parcelable {
String name;
boolean programmingRelated;
Skill(Parcel in) {
this.name = in.readString();
this.programmingRelated = (in.readInt() == 1);
}
@Override
void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(programmingRelated ? 1 : 0);
}
static final Parcelable.Creator<Skill> CREATOR
= new Parcelable.Creator<Skill>() {
Skill createFromParcel(Parcel in) {
return new Skill(in);
}
Skill[] newArray(int size) {
return new Skill[size];
}
};
@Override
int describeContents() {
return 0;
}
}
}
实现接口 重写describeContents()和writeToParcle()两个方法,提供一个常量
(Praelable.Creatorde接口的一个实现,里面也有两个方法需要实现)。
效率很高
3.3 Binder
service 完全解析 http://blog.csdn.net/guolin_blog/article/details/11952435
AIDL完全解析http://blog.csdn.net/lmj623565791/article/details/38461079