标签:
开启多进程和负面影响
IPC:进程间通讯。线程与进程是包含的关系。
使用只有1个方法:给四大组件在manifest里指定android:process属性,无法给一个线程或者实体类指定其运行时所在的进程。
android:process=":remote"
进程名以":"开头的进程属于私有进程,其他应用的组件不可以和它跑早同一个进程中,而进程名不以":"开头的属于全局进程,
其他应用可以通过ShareUID方式可以和它跑在同一个进程中。
UID:每个应用分配唯一的UID,两个相同UID签名相同可以共享数据。
多线程的负面影响:
1、静态成员和单例模式完全失效(通过内存来共享数据都会失败);
2、线程同步机制完全失效;
3、SharedPreferences可靠性下降(内存中只有一份SharedPreferences);
4、Application会多次创建;
结论:多进程模式中,不同进程的组件会拥有独立的虚拟机、Application以及内存空间。
IPC基础
Serializable:
Java提供的序列化接口
用的时候用类实现Serializable并在接口里面声明
private static final long serialVersionUID = 51989342343L;
对象的序列化和反序列化使用ObjectOutputStream和ObjectInputStream。手动指定serialVersionUID可以很大程度避免反序列化失败。
Parcelable:
Android提供推荐的新的序列化接口,效率高。
public class User implements Parcelable, Serializable {
private static final long serialVersionUID = 519067123721295773L;
public int userId;
public String userName;
public boolean isMale;
public Book book;
public User() {
}
public User(int userId, String userName, boolean isMale) {
this.userId = userId;
this.userName = userName;
this.isMale = isMale;
}
-
- //返回当前对象的内容描述
public int describeContents() {
return 0;
}
- //序列化
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 Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
- //从系列化后的对象中创建原始对象
public User createFromParcel(Parcel in) {
return new User(in);
}
- //创建指定长度的原始对象数组
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()); }
@Override
public String toString() {
return String.format(
"User:{userId:%s, userName:%s, isMale:%s}, with child:{%s}",
userId, userName, isMale, book);
}
}
Binder:
IPC角度:Android中的一种跨进程通讯方式;
Android Framework角度:ServiceManager连接各种Manager和相应ManagerService的桥梁;
Android应用层:客户端和服务端进行通讯的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端可以
获取服务端的数据和服务(包含普通服务和基于AIDL服务)。
实现了IBinder接口,在android开发中主要用在Service中,包括AIDL和Messenger,普通servece中Binder不涉及进程间通讯,Messenger底层是AIDL。
AIDL的本质是系统为我们提供了一种快速实现Binder的工具。
Binder的两个重要方法linkToDeath和unlinkToDeath,当Binder死亡时会收到通知。
IPC实现方式
Intent中附加extra(传递Bundle数据),ContentProvider、文件SD卡共享(适合在对数据同步要求不高的进程之间进行通讯)、Binder、网络通讯(Socket)、AIDL
Messenger:数据传输必须将数据放入Message中,Messenger和Message都实现了Parcelable接口,串行处理。
AIDL:Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。
AIDL中会大量使用到Parcelable来序列化对象。
如果AIDL中用到了自定义的Parcelable对象,必须建立个和他同名的AIDL文件。
AIDL流程:创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的
对象,然后客户端就可以绑定服务端Service,建立连接后就可以访问远程服务端的方法。
Socket:不仅可以实现进程间通讯,还可以实现设备间通讯,前提是设备之间的IP可见;
ContentProvider:天生适合进程间通讯,底层Binder
Binder连接池
BinderPool:将每个业务模块的Binder请求统一转发到远程Service中去执行;
能够极大提高AIDL的开发效率,并可避免大量Service的创建。
第2章 IPC机制
标签:
原文地址:http://www.cnblogs.com/fruitbolgs/p/5230283.html