第2章 IPC机制

开启多进程和负面影响

IPC:进程间通讯。

线程与进程是包含的关系。
 
使用只有1个方法:给四大组件在manifest里指定android:process属性,无法给一个线程或者实体类指定其运行时所在的进程。
android:process=":remote"
进程名以":"开头的进程属于私有进程,其他应用的组件不可以和它跑早同一个进程中,而进程名不以":"开头的属于全局进程,
其他应用可以通过ShareUID方式可以和它跑在同一个进程中。
 
UID:每个应用分配唯一的UID,两个相同UID签名相同可以共享数据。
 
多线程的负面影响:
1、静态成员和单例模式完全失效(通过内存来共享数据都会失败);
2、线程同步机制完全失效;
3、SharedPreferences可靠性下降(内存中只有一份SharedPreferences);
4、Application会多次创建;
结论:多进程模式中,不同进程的组件会拥有独立的虚拟机、Application以及内存空间。
 
IPC基础
Serializable:
Java提供的序列化接口
用的时候用类实现Serializable并在接口里面声明
privatestaticfinallong serialVersionUID =51989342343L;
对象的序列化和反序列化使用ObjectOutputStream和ObjectInputStream。手动指定serialVersionUID可以很大程度避免反序列化失败。
 
Parcelable:
Android提供推荐的新的序列化接口,效率高。
publicclassUserimplementsParcelable,Serializable{
  privatestaticfinallong serialVersionUID =519067123721295773L;
  publicint userId;
  publicString userName;
  publicboolean isMale;
  publicBook book;
  publicUser(){
  }
  publicUser(int userId,String userName,boolean isMale){
    this.userId = userId;
    this.userName = userName;
    this.isMale = isMale;
  }
  //返回当前对象的内容描述
  publicint describeContents(){
    return0;
  }

  //序列化
  publicvoid writeToParcel(Parcel out,int flags){
    out.writeInt(userId);
    out.writeString(userName);
    out.writeInt(isMale ?1:0);
    out.writeParcelable(book,0);
  }
  publicstaticfinalParcelable.Creator<User> CREATOR =newParcelable.Creator<User>(){
  //从系列化后的对象中创建原始对象
  publicUser createFromParcel(Parcel in){
    return newUser(in);
  }
  //创建指定长度的原始对象数组
  publicUser[] newArray(int size){
    return newUser[size];
  }
};

//反序列化
privateUser(Parcel in){
  userId = in.readInt();
  userName = in.readString();
  isMale = in.readInt()==1;
  book = in.readParcelable(Thread.currentThread().getContextClassLoader());
}

@Override publicString toString(){   returnString.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的创建。
 

 

posted @ 2016-03-01 11:19  咖啡馆的水果拼盘  阅读(184)  评论(0编辑  收藏  举报