参考书籍:
Android开发艺术探索
注:京东链接https://item.jd.com/11760209.html
IPC简介
* IPC
Inter-process Communication:进程间通信和跨进程通信
* 线程和进程
1.线程:进程中程序的执行单元,但是线程本身依靠程序运行
2.进程:执行中的程序,其中一个进程至少包含一个线程
* Android进程通信方式
1.Binder
2.Socket(实现2个终端间的通信,或者2个进程间的通信)
* Android多进程应用场景
1.某些模块需要运行在单独的进程中
2.扩大应用的可用最大内存(早期版本是16M)
3.当前应用需要向其他应用获取数据(如支付宝,微信)
Android多进程模式
* 通过在清单文件里面为四大组件声明android:process属性,就开启了多进程模式
* 进程名的两种命名方式
1.私有进程名:com.caesar.demo.SecondActivity:remote
<activity
android:com.caesar.demo.SecondActivity
android:process=":remote"/>
2.普通全局进程名:com.caesar.demo.ThirdActivity.remote
<activity
android:com.caesar.demo.ThirdActivity
android:process="com.caesar.demo.ThirdActivity.remote"/>
注:
——>进程名以":"开头的进程属于当前应用的私有进程,其它应用组件不能和其在
一个进程中;
——>普通的进程命名为全局进程通过ShareUID来实现将2个应用跑在一个进程中;
(1)两个应用跑在一个进程前提:ShareUID相同,签名相同;
(2)两个应用在一个进程就可以共享数据,他们就像一个应用的两个部分
多进程模式的运行机制
* Android中不同的进程会分配独立的虚拟机,不同的虚拟机在内存分配上拥有不同的
地址空间
* 多进程会造成的问题:
1.静态成员和单例模式失效
2.线程同步机制完全失效
3.SharePreferences可靠性下降(SharePreference底层是通过读写xml实现的,
多进程会造成并发修改异常)
4.Application会多次创建.
* Android跨进程通信方式
1.Intent
2.基于Binder的Messenger和AIDL
3.Socket
IPC基础概念
Serializable接口(开销大-大量I/O读写操作,使用简单)
1.Serializable序列化过程:
(1)需要序列化的类
class User implements implements Serializable {
//声明一个标识,反序列化会用到
private static final long serialVersionUID = 519067123721295773L;
public String userName;
public int userAge;
------
}
(2)序列化对象(以流的形式将对象持久化到存储设备)
User user = new User("caesar",24);
ObjectOutputStream out = new ObjectOutputStream
(new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();
(3)反序列化(从存储设备中读取对象)
ObjectInputStream out = new ObjectInputStream
(new FileInputStream("cache.txt"));
User newUser = (User)in.readObject();
in.close();
注:
1.serialVersionUID作用:用于辅助序列化和反序列化的,序列化的
serialVersionUID只有和当前类的serialVersionUID相同才能被正常序列化
2.静态成员变量属于类不属于对象,不参与序列化过程;
用transient关键字修饰的变量不参与序列化过程
Parcelable接口(开销小,使用麻烦)
public class User implements Parcelable {
public int userId;
public String userName;
public boolean isMale;
public Book book;//另外一个可序列化对象
public User(int userId, String userName, boolean isMale) {
this.userId = userId;
this.userName = userName;
this.isMale = isMale;
}
@Override
public int describeContents() {
return 0;
}
//序列化
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(userId);
out.writeString(userName);
out.writeInt(isMale ? 1 : 0);
out.writeParcelable(book,0);
}
//反序列化
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
private User(Parcel in) {
userId = in.readInt();
userName = in.readString();
isMale = in.readInt() == 1;
book = in.readParcelable(Thread.currentThread().
getContextClassLoader());
}
}
注:
(1)序列化由writeToParcel()完成;
(2)反序列由CRETOR完成;
(3)book是另外一个可序列化对象,在反序列化中需要传递当前线程的
上下文类加载器。
网友评论