Android开发艺术探索--第二章IPC机制(1)

原创 2016年08月28日 18:18:21

最近在拜读任主席的Android开发艺术探索,现在看了一半,再回头看前面的,感觉跟没有看一样,所以还是把知识点总结一下吧,这一节咱们来讲一下IPC,即进程间通信

开启多进程模式

在Android中使用多进程只有一种方法:给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidManifest中指定android:process属性,除此之外没有其他办法(除去通过JNI在native层去fork):

  • android:process=”:remote”,这种方式的标记的进程名为包名:remote,“:“的含义是指要在当前的进程名前附加包名,其次,进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。
  • android:process=”com.example.wpp.remote”,这种声明方式是完整的命名方式,不会附件包名信息,属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中

Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据,而两个应用通过ShareUID跑在同一个进程需要这两个应用有相同的ShareUID并且签名相同才可以,在这种情况下,它们可以互相 访问对方的私有数据,比如data目录、组件信息等,不管它们是否泡在同一个进程中。当然如果它们跑在同一个进程中,那么除了能共享data目录、组件信息,还可以共享内存数据

使用多进程会造成如下几方面的问题:
1. 静态成员和单例模式完全失效
2. 线程同步机制完全失效。
3. SharedPreferences的可靠性下降
4. Application会多次创建。

IPC中的一些基本概念

本节主要介绍IPC中的一些基本概念:Serializable接口、Parcelable接口以及Binder

Serializable接口

Serializable是java所提供的一个序列化接口, 是一个空接口,为对象提供标准的序列化和反序列化操作,使用时需要声明实现Serializable接口,并指定一个类似下面的标识即可自动实现默认的序列化过程。

private static final long serialVersionUID = 8711368828010083048L

这个serialVersionUID是用来辅助序列化和反序列化过程的,原则上序列化后的数据中的serialVersionUID只有和当前类的serialVersionUID相同才能够正常的被反序列化。反序列化的时候会从待反序列的文件中读取这个值和目标类中的值比对,如果不一致就会反序列化失败。这个值可以手动指定也可以让IDE通过当前类的结构自动去生成它的hash值,如果通过IDE自动生成,反序列化时当前类有所改变,那么系统会重新计算serialVersionUID的值,于是反序列化失败。当我们手动指定了它以后,可以在很大程度上避免反序列化过程的失败。
注意:如果类结构发生了非常规性改变,比如修改了类名,修改成员变量类型,尽管serialVersionUID相同,此时反序列化还是会失败,程序crash
另外,系统的默认序列化过程也是可以改变的,通过重写系统writeObject和readObject方法即可。

Parcelable接口

Parcelable接口是Android提供的新的序列化方式,Parcelable也是一个接口,下面的示例是一个典型的用法。

public class User implements Parcelable{
    public int userId;
    public String userName;
    public boolean isMale;

    public Book book;
    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.wirteString(userName);
        out.wirteInt(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[] new Array(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());
    }
}

Parcelable方法说明

方法 功能 标记位
createFromParcel(Parcel in) 从序列化后的对象中创建原对象
new Array(int size) 创建指定长度的原始对象数组
User(Parcel in) 从序列化后的对象中创建原始对象
writeToParcel(Parcel out, int flag) 将当前对象写入序列化结构中,其中flag标识有两种值:0或者1.为1时标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0 PARCELABLE_WRITE_RETURN_VALUE
describeContents 返回当前对象的内容描述,如果还有文件描述符,返回1,否则返回0,几乎所有情况都返回0


系统已经为我们提供了许多实现了Parcelable接口的类,它们都是可以直接序列化的,比如Intent、Bundle、Bitmap等,同时List和Map也可以序列化,前提是它们里面每个元素都是可序列化的。


Parcelable和Serializable区别:
Serializable是java中的序列化接口,其使用起来简单但是开销大,序列化和反序列化需要大量I/O操作。而Parcelable是Android中的序列化方式,因此更适合用在Android平台上,缺点就是用起来稍微麻烦点,但是它的效率高,这是Android推荐的序列化方式。

版权声明:本文为博主原创文章,转载请告知

Android开发艺术探索——第二章:IPC机制(上)

Android开发艺术探索——第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序...
  • qq_26787115
  • qq_26787115
  • 2016年09月25日 21:20
  • 3142

[读书笔记]《Android开发艺术探索》第二章笔记

《Android开发艺术探索》第二章笔记IPC Inter-Process Communication的缩写。含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。 进程和线程的区别 按照...
  • CodeEmperor
  • CodeEmperor
  • 2016年02月03日 16:03
  • 1674

第二章IPC机制(Android开发艺术探索)

1.Bundle传递数据实现IPC(当然传递的类型必须要bundle支持) 特殊情况:传递的数据类型Bundle不支持的情况(即无法通过intent传输),这种情况可以考虑:我们通过A进程中的In...
  • u013277740
  • u013277740
  • 2016年01月04日 21:13
  • 518

《Android开发艺术探索》IPC机制—1

今天看了《Android开发艺术探索》中的IPC机制,将读书笔记以自己的逻辑重新梳理一下。      跨进程通信,要了解这个首先得明白什么是进程,什么是线程。进程和线程其实是两个完全不同的概念。从操...
  • qq_32493151
  • qq_32493151
  • 2017年05月21日 17:26
  • 91

Android开发艺术探索笔记_第二章 IPC机制

IPCInter-Process Communication简介 Android中的多进程模式 1 多进程会产生的问题 IPC基础概念介绍 1 Serializable接口1. IPC(Inter-P...
  • u014772414
  • u014772414
  • 2016年07月10日 23:33
  • 172

Android开发艺术探索——第二章:IPC机制(中)

Android开发艺术探索——第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了。 一.Android中的IPC方式 本...
  • qq_26787115
  • qq_26787115
  • 2016年10月19日 22:16
  • 3222

《Android开发艺术探索》第二章IPC机制小结

1. 通过android:process开启新的进程 进程名以“:”开头的属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中, 不以冒号开头的为全局进程,其他应用可以通过ShareUID...
  • doom20082004
  • doom20082004
  • 2016年12月05日 19:55
  • 113

《Android开发艺术探索》读书笔记第二章--IPC机制

本文是《Android开发艺术探索》读书笔记系列第二章–IPC机制 一、IPC基础 Android IPC简介 Inter-Porcess Communication,含义为进程间通信或...
  • a8341025123
  • a8341025123
  • 2018年02月08日 15:51
  • 4

IPC机制 - Android开发艺术探索读书笔记(第二章)

第二章 - IPC机制 2.1 Android IPC简介 1、IPC(Inter-Process Communication)进程间通信或跨进程通信 2、线程与进程?     线程 -CPU调度最小...
  • Goo_x
  • Goo_x
  • 2016年01月27日 00:07
  • 376

Android的IPC机制

使用Messenger 1、特点:  * (1)Messenger对AIDL做了封装,使得我们可以更简便地进行进程间通信。  * 由于它一次处理一个请求,所以在服务端我们不考虑线程同步的问题,...
  • zizidemenghanxiao
  • zizidemenghanxiao
  • 2015年12月17日 15:35
  • 9150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android开发艺术探索--第二章IPC机制(1)
举报原因:
原因补充:

(最多只允许输入30个字)