IPC学习笔记

1 IPC简介

IPC的含义是进程间通信,或者跨进程通信。
区分进程和线程

  • 进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

  • 线程:程序执行的最小单元,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源

不同于管道信号量消息邮箱,android中的IPC就是Binder了,另外android还支持Socket通信。

2 android中的多进程模式

2.1 开启多进程模式

通过给四大组件在AndroidMenifest.xml指定android:process属性,我们可以轻易的开启多进程模式。但是多进程模式有很多负面影响。

android:process = ":remote"//私有进程,属于当前包。
android:process = "com.tijun.test:remote"//全局进程,其他应用通过ShareUID和他泡在同一个进程中

2.2 多进程模式的运行机制

android为每一个应用/进程都分配了独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,所以在不同的虚拟机中访问同一个对象会产生多个副本。所以进程一中的全局变量和进程二中的不同。

所有运行在不同进程中的四大组件,只要他们之间通过内存在共享数据,都会共享失败,这就是多进程带来的主要影响。正常情况下四大组件它能够通过一些中间层来共享数据。

所以一般来说,多进程会出现一下几种问题

  • 静态成员和单列完全失效。
  • 线程同步机制完全失效(锁定操作失效)
  • SharedPreference的可靠性下降(不支持两个进程同时文件操作)
  • Application会多次创建

所以我们需要IPC

3 IPC基础概念介绍

3.1 Serializable 接口

它是java所提供的一个序列化接口

// access modifiers, accessors and constructors omitted for brevity
public class SerializableDeveloper implements Serializable{
    String name;
    int yearsOfExperience;
    List<Skill> skillSet;
    float favoriteFloat;

    static class Skill implements Serializable {
        String name;
        boolean programmingRelated;
    }
}

SerializableDeveloper 对象就是一个已经序列化的对象,我们可以把它放到Intent或者写入文件流

反序列化的时候,个图SerillizableExtra,或者readObject等方法

serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。

这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。

3.2 Pracelable

// access modifiers, accessors and regular constructors ommited for brevity
class ParcelableDeveloper implements Parcelable {
    String name;
    int yearsOfExperience;
    List<Skill> skillSet;
    float favoriteFloat;

    ParcelableDeveloper(Parcel in) {
        this.name = in.readString();
        this.yearsOfExperience = in.readInt();
        this.skillSet = new ArrayList<Skill>();
        in.readTypedList(skillSet, Skill.CREATOR);
        this.favoriteFloat = in.readFloat();
    }

    void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(yearsOfExperience);
        dest.writeTypedList(skillSet);
        dest.writeFloat(favoriteFloat);
    }

    int describeContents() {
        return 0;
    }


    static final Parcelable.Creator<ParcelableDeveloper> CREATOR
            = new Parcelable.Creator<ParcelableDeveloper>() {

        ParcelableDeveloper createFromParcel(Parcel in) {
            return new ParcelableDeveloper(in);
        }

        ParcelableDeveloper[] newArray(int size) {
            return new ParcelableDeveloper[size];
        }
    };

    static class Skill implements Parcelable {
        String name;
        boolean programmingRelated;

        Skill(Parcel in) {
            this.name = in.readString();
            this.programmingRelated = (in.readInt() == 1);
        }

        @Override
        void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeInt(programmingRelated ? 1 : 0);
        }

        static final Parcelable.Creator<Skill> CREATOR
            = new Parcelable.Creator<Skill>() {

            Skill createFromParcel(Parcel in) {
                return new Skill(in);
            }

            Skill[] newArray(int size) {
                return new Skill[size];
            }
        };

        @Override
        int describeContents() {
            return 0;
        }
    }
}

实现接口 重写describeContents()和writeToParcle()两个方法,提供一个常量
(Praelable.Creatorde接口的一个实现,里面也有两个方法需要实现)。
效率很高

3.3 Binder

service 完全解析 http://blog.csdn.net/guolin_blog/article/details/11952435
AIDL完全解析http://blog.csdn.net/lmj623565791/article/details/38461079
binder机制

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值