IPC(Inter-Process Communication)进程间通信,就是指在两个进程之间进行数据交换的过程。那么就要先了解什么是进程,什么是线程。从一定意义上讲,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。即一个进程可以包括多个线程,也可以只有一个线程。
我们在使用进程间通信的过程中需要了解到两个关于数据的接口,一个是可序列化(Serializable),一个是可打包(Parceable):
Serializable(可序列化):
Serializable接口里面什么东西都没有,只是一个标识,代表着可以不可以序列化,我们在创建类的时候,如果想要这个类型的对象可以列化和反序列,只需要实现这个接口就可,同时也可以指定serialVersionUID(其实可以不需要,这个可能会对反序列早成影响)public static final long serialVersionUID = 1L。如果写了serialVersionUID那么在反序化的时候就会比较文件中的这个值和当前类的值是否相等,如果一致,则会反序列成功,反之,则会抛出异常。
Parceable(可打包):
可打包的接口,一个类实现了这个接口,也可以实现序列化,并且可以同Intent和Binder传递。现在看看Parceable接口里面的方法:
createFromParcel(Parcel in)从序列化后的对象中创建原始对象。
newArray(int size) 创建指定长度的原始对象数组。
User(Parcel in)从序列化后的对象创建原始对象。
writeToParcel(Parcel out,int flags)将当前对象写入序列化结构中,其中flags标识有两中值0或者1,为1时标识当前对象需要作
为返describeContents()返回当前对象内容描述,如果含有文件描述符,返回1,否则返回0 CONTENTS_FILE_DESCRIPTOR
Serializable和Parceable区别:Serializable是Java中的序列化接口,其使用简单但是开销很大,在序列化和反序列化中需要大量的IO操作,Parceable是Android中的序列化接口更适用于Android平台,虽然适用麻烦,但是效率高,其主要是在内存上序列化,如果将对象序列化到存储设备或者将对象序列化后通过网络传输,这两种情况Serializable就比Parceable更加适合。
IPC进程间通信:
介绍完关于IPC通信中数据的接口,现在来了解进程间的通信。
1、AIDL
开发android的都应该了解AIDL(AndRoid Interfacedefinition language)Android接口定义语言,编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
AIDL的创建:
首先通过编译器生成AIDL文件,如:
// IMyBook.aidl package com.example.lenovo.myview; import com.example.lenovo.myview.Book; // Declare any non-default types here with import statements interface IMyBook { void addBook(in Book book); List getBookList(); }
这里指的注意的是:
所有AIDL文件。其中自定义的Parcelable对象和AIDL对象必须要显示的improt进来,不管他们是否和AIDL文件处于相同的包内。如果AIDL文件中使用了Parelable对象,就必须在它相同的文件夹内创建一个同这个对象的AIDL文件,申明这个是Parelable对象。如:
这里用到一个Book类,是可打包的,上述所说对于自定义的Parcelable需要显示import,所以有 import com.example.myview.Book;然后在相同文件夹内创建一个Book.aidl的文件:
// Book.aidl package com.example.lenovo.myview; // Declare any non-default types here with import statements parcelable Book;在这个文件里面就只需要声明Book类是可打包即可。
服务器:
在OnBind方法中返回这个AIDL类型的Binder即可(即是其存根stub),
IBinder iBinder = new IMyBook.Stub() { @Override public void addBook(Book book) throws RemoteException { } @Override public List getBookList() throws RemoteException { return null; } }; @Override public IBinder onBind(Intent intent) { return iBinder; }客户端:客户端只需要绑定这个服务,并且在服务连接器中获取到这个Binder,并且通过Stub.asInterface创建一个IMbook对象出来:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webView = (WebView) findViewById(R.id.webView); bindService(new Intent(this,MyService.class),conn,BIND_AUTO_CREATE); } ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IMyBook iMyBook = IMyBook.Stub.asInterface(service); try { iMyBook.getBookList(); iMyBook.addBook(new Book()); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } };以上是我根据最近学习AIDL的认识。