Android进程间通信机制(一)——基础篇
在正式了解Android的IPC机制之前我们了解以下几个问题:
- 什么是进程间通信
- Android中一个应用实现多进程的方式
- IPC基础:Serializable接口、Parcelable接口和Binder
一、什么是进程间通信
进程间通信(Inner-Process Comunication,简称IPC),就是指不同进程之间的信息传递。
进程是系统进行资源分配和调度的基本单位,是操作系统的结构的基础;一个应用至少有一个进程(当然也可以拥有多个进程),一个进程中有包含了多个线程(线程是CPU调度的最小单位),进程相当于是线程的容器,线程可以使用操作系统分配个进程的资源。
IPC机制是现代操作系统都存在的机制,而Android是基于Linux内核的OS,在Android中特有的方式Binder。
二、Android中创建多进程
Android中在一个应用中创建多个进程的方式只有一种:在AndroidManifest.xml文件中申明四大组件的标签增加*“android:process=”""*属性即可。如下所示:
1.私有进程
<service
android:name=".service.MyAIDLService"
android:enabled="true"
android:exported="true"
android:process=":aidl_test" />
2.全局进程
<service
android:name=".service.MyAIDLService"
android:enabled="true"
android:exported="true"
android:process="com.kanlulu.aidl:aidl_test_test" />
通过第一种方式创建的多进程以":“开头的”:aidl_test“(省略了主进程它的全称为"com.kanlulu.aidl_test:aidl_test”) 是私有进程,其他应用组件不能和它运行在同一个进程中。
通过第二种写了完整名称的方式"com.kanlulu.aidl:aidl_test_test"是全局进程,可以使用相同ShareUID的方式运行在同一进程中(签名也需要一样)。
使用多进程可以带来的好处:
- 创建一个新的进程,可以获得更多的内存空间;
- 主进程被杀死后,子进程任然可以运行(推送);
- 子进程崩溃,主进程可以正常运行;
- …
使用多进程也会带来一些问题和需要注意事项:
- 1.静态成员和单例模式完全失效;
- 2.线程同步机制会完全失效;
- 3.SharedPreferenced的可靠性会降低;
- 4.Application会多次创建。
首先要说明的是同一个应用中创建的子进程在内存中的地址和主进程是不一样的,所以第1条中静态成员在不同进程间修改的其实是位于不同内存地址的副本,单例模式也是一样的。第2条原因和第一条是类似的;至于第3条,SharedPreferenced的并发访问会导致不可预料的错误。另外需要注意第四条,创建子进程时也会重新创建一次Application。
三、序列化Serializable接口和Parcelable接口
序列化是指将运行时的对象转换成二进制,然后保存到流、内存或者通过网络传输给其他端。
1、Serializable接口
Serializable接口是Java提供的序列化接口。
public interface Serializable {
}
下面是一个实现序列化接口的实体类:
package com.kanlulu.aidl_test.bean;
import java.io.Serializable;
public class Persion implements Serializable {
private String name;
private int age;
private String desc;
private static final long serialVersionUID = 8829975621220483374L;
public Persion() {
}
public String getName() {
return name;
}
<