1. Android IPC简介
- 基本概念
- IPC是Inter-Process Communication的缩写,含义是进程间通讯或者夸进程通讯,是指两个进程进行数据交换的过程.
- 线程是CPU调度的最小单元,同时线程是一种有限的系统资源.
- 进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用.
一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系
2. Android中的多进程模式
2.1 开启多进程模式
Android中使用多进程只有一种方法,就是给四大组件(Activity,Service,Receiver,ContentProvider)在manifest文件中指定android:process属性;
<activity
android:name="TestActivity"
android:process=":remote"
/>
<service
android:name="TestService"
android:process="com.test.myApp.remote"/>
<receiver
android:name="TestReceiver"
android:process="com.test.myApp.remote"
/>
<provider
android:name="TestProvider"
android:authorities="com.test.myApp.TestProvider"
android:process="com.test.myApp.remote"/>
android:process=":remote" 该进程的完整名称是<包名:remote>,这样标示的进程属于当前应用的私有进程,其他应用的组件不可以和它运行在同一进程中
android:process="com.test.myApp.remote" 该进程的名称为com.test.myApp.remote,不以:开头的进程属于全局进程,其他应用通过ShareUID方式可以运行在同一个进程
Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据
2.2多进程运行机制
Android系统会为每个应用分配一个独立的虚拟机,或者说为每个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同地址控件,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本,并且多个副本间互不干扰,修改一个副本的值不对改变另外的副本的值
多进程下会有如下问题
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharedPreferences 的可靠性下降
- Application 会多次创建
3. IPC基础概念介绍
基础概念主要包含三方面内容:Serializable接口;Parclable接口和Binder
Serializable和Parclable接口可以完成对象的序列化,当我们用Intent和Binder传输数据时就需要使用Serializable和Parclable
3.1 Serializable接口
- Serializable实现方式
public class TestSerializableBean implements Serializable {
private static final long serialVersionUID = -1460666235331419254L;
public int userId;
public String userName;
}
- 序列化和反序列化过程
File file= new File(FileManager.getSdCardFileDir(),"cache.txt");
FileManager.createFile(file);
//序列化过程
ObjectOutputStream outputStream = null;
try {
TestSerializableBean testSerializableBean = new TestSerializableBean(18, "xiaoming");
outputStream = new ObjectOutputStream(new FileOutputStream(file.getAbsolutePath()));
outputStream.writeObject(testSerializableBean);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//反序列化过程
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(new FileInputStream(file.getAbsolutePath()));
TestSerializableBean bean = (TestSerializableBean) objectInputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (objectInputStream != null) {
try {
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
serialVersionUID 是用来辅助序列化和反序列化,原则上序列化数据中的serialVersionUID和当前类的serialVersionUID相同才能被反序列化
3.2 Parcelable 接口
Parcelable 也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并通过Intent和Binder传递
实现方式
public class TestParcelableBean implements Parcelable {
public int userId;
public String userName;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.userId);
dest.writeString(this.userName);
}
public TestParcelableBean() {
}
protected TestParcelableBean(Parcel in) {
this.userId = in.readInt();
this.userName = in.readString();
}
public static final Creator<TestParcelableBean> CREATOR = new Creator<TestParcelableBean>() {
@Override
public TestParcelableBean createFromParcel(Parcel source) {
return new TestParcelableBean(source);
}
@Override
public TestParcelableBean[] newArray(int size) {
return new TestParcelableBean[size];
}
};
}
Parcelable和Serializable区别
Serializable:是Java中的序列化接口,使用简单但是开销很大,序列化和反序列化过程需要大量的I/O操作.
Parcelable:是Android中序列化方式,实现起来麻烦,但是效率很高
网友评论