IPC是Inter-Process Communication的缩写,也就是进程间的通讯,任何一个操作系统都有着自己的IPC,Android系统同样的不例外.众所周知,Android是基于Linux的一个移动操作系统,但它的IPC不同于Linux,Android有自己独特的Binder。另外,Android应用程序时用Java语言进行开发,同样的我们还可以用Java的Socket来进行IPC。

进程和线程

  进程,官方的说法是cpu执行的最小单元,相信好多人看到这句话就懵逼了,什么是最小的单元?简单的说,大部分情况下就是操作系统上的个正在运行的应用。听了是不是瞬间神清气爽啊!
  那什么是线程呢?举个实际的例子吧,我是 建筑大学毕业的数学系学渣,在这种学校里自然就会有很多干建筑相关这一行的同学,所以很多同学上了工地,那工地上就有许许多多辛苦的工人。那么,进程就是工地,线程就是这个工地上的工人,一个工地有很多工人同时干活,那也就是说一个进程可以同时让多个线程分别执行不同的任务,这样是不是就大大提高了效率。所以进程和线程之间是包含的关系。
  唠了了这么多,那多进程在Android中体现在哪里?

  1. 不同的应用之间需要数据交流
    • ContentProvider获取其他应用的数据
    • AIDL执行其他应用的Service
  2. 通常情况下,一个进程只有一份指定大小的内存空间可以用,科室但一个应用的内存不够用时,可以怎么办?在本应用内再开一个进程,这样就能使用两份内存空间了emoji:[笑着哭]。这个时候IPC就显得格外重要

开启Android应用的多进程

  很简单,通过四大组件在Androidmanifest.xml注册时指定属性andoid:process就可以轻松开启新的进程

  一旦打开了这个Activity,该应用会再次创建Application,也就是是两个一模一样的应用在系统同时run,可以打开ddms或者shell查看,发现两个不同pid进程在跑,这说明当一个组件跑在新的进程的时候,系统会分配独立的虚拟机。
  android:process这个属性值还可以这么写com.hk:remote或者:remote,那么这种写法与com.hk.remote有什么区别呢?首先,:remotecom.hk:remote的简写,其次,进程名以“:”开头的进程属于当前应用的私有进程,其他 应用不可以和它跑在同一个进程中,否则可以通过ShareID方式使进程共享。

对象的序列化

IPC的时候进程会传递对象,但传递的对象必须经过序列化,序列化的方式有两种
Serializable和Parcelable

  • Serializable的使用
    1. Serializable是Java提供的一个序列化接口,他是一个空接口,创建一个类person

public class Person implements Serializable {
private static final long serialVersionUID = 6L;
private String name;
private int age;
//Constructor and Getter/Setter
//...
}

            >serialVersionUID可写可不写,但存在即合理,建议手工指定,因为可以提高反序列化的成功率。序列化的时候系统会把当前类的serialVersionUID写入序列化文件中(也可能是其他),当反序列化的时候系统回去检测文件中的serialVersionUID,看它是否已当前类的serialVersionUID一直,如果一致就说明序列化的类的版本和当前类的版本相同,这个时候可以成功反序列化,如果不指定serialVersionUID的值,系统在序列化的时候会根据类的结构自动生成serialVersionUID,并写入序列化文件中,如果反序列化的时候,当前类走了修改,则反序列化时的serialVersionUID就会重新生成,造成serialVersionUID不一致反序列化失败,所以如果手动指定serialVersionUID,类结构发生变化,系统仍然能最大限度的恢复数据,而不会让程序崩溃。  2. 序列化

Person person = new Person("hvcker",22);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
out.writeObject(person);
out.close();

3. 反序列化

ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.txt"));
Person p = (Person) in.readObject();
in.close();

* Parcelable的使用  Parcelable也是一个接口,实现这个接口就可以实现序列化      public class User implements Parcelable {          private int id;          private String userName;          //Constructor and Getter/Setter          //...          protected User(Parcel in) {              id = in.readInt();              userName = in.readString();          }          public static final Creator CREATOR = new Creator() {              @Override              public User createFromParcel(Parcel in) {                  return new User(in);              }              @Override              public User[] newArray(int size) {                  return new User[size];              }          };          @Override          public int describeContents() {              return 0;          }          @Override          public void writeToParcel(Parcel dest, int flags) {              dest.writeInt(id);              dest.writeString(userName);          }      }| 方法      |    功能 | 所属类 || -------- | --------| -- || createFromParcel(Parcel in)| 从序列化后的对象中创建原始对象 |User.CREATOR|| newArray(int size)|创建指定长度的原始对象数组|User.CREATOR|| writeToParcel(Parcel dest, int flags)|将当前对象写入序列化结构中,其中flags标识有两种:0或者1。为1时当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0|User||describeContents()|返回当前对象的内容描述,如果含有文件描述符,返回1,否则返回0,几乎所有情况都返回0|User|> Serializable是Java中的序列化接口,使用起来简单但开销很大,序列化和反序列化过程是I/O操作的过程;Parcelable是Android提供的序列化方式,因此更适合用在Android平台上,parcelable主要用在内存序列化上,但通过parcelable将对象序列化到存储设备中或者将对象 序列化后通过网络传输这个过程很复杂,这种情况下建议用Serializable。

更多相关文章

  1. 【Android】Aidl使用详解(支持多个回调和传递自定义对象)
  2. Android 通过 Intent 传递类对象
  3. Android开发UI之在子线程中更新UI
  4. Android 进程间通信AIDL(一)
  5. android 简单线程同步之CountDownLatch

随机推荐

  1. android GPS定位和卫星个数
  2. Android 架构
  3. HTTP 工具类 封装 For android
  4. android 如何拖动控件的实现
  5. android 写入data/data/包名/file/中
  6. android boot
  7. Android 使用Handler模仿流行的AsyncHttp
  8. android googlemap的location报空指针解
  9. android技术博客汇总
  10. 如何使用 Android Studio 的 git hub 功