IPC机制

简介:
    含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。
什么是线程:
    线程是CPU调度的最小单元,同时,线程是一个有限的系统资源。
什么是进程:
    进程是指执行单元,在PC和移动设备上指一个程序或者一个应用。
总结:一个进程中包含多个线程。  一个进程中可以只有一个线程,即主线程。


Android中的多进程模式:
    首先这里说android多进程是指一个应用中存在多个进程的情况,在android中使用多进程只要一个方法,那就是给四大组件在AndroidMwnifest中指定android:process属性。

如下是实例,如何在android中创建多进程: 
    
根据上述的实例,可以在android的IDE中可以看到当前的进程。一个是当前的MainActivity,还有.SecondActivity    .ThirdActivity两个界面。在DDMS中查看进程如下图:
    

结论:在上述图中peocess属性中的名字是一“:”开头的,是属于当前应用的私有进程,其他应用的组件不可以和它跑在同意个进程中,而进程名不一“:”开头的,属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。

多进程模式的运行机制:
    在android多进程运行中也会出现好多问题:举例:
        首先创建一个一个类UserManager,里面定义一个public的静态成员变量,如下图:
        

    然后在onCreate中把sUserId重新赋值为2,打印出这个静态变量的值后再启动SecondActivity,在 SecondActivity中再打印一下sUserId的值。运行结果如下图所示:
        

结论:在不同进程中数据的是可以共享的,但是在某个进程中修改某个数据。在别的进程中是无法显示的,这个就是多进程在日常运用中所出现的问题。所有运行在不同进程中的四大组件,只要他们之间需要通过内存来共享数据,都会失败。

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

serializable接口:
    serializable是java所提供的一个序列化接口,他是一个空接口。如何实现序列化如下图所示:
    

下面就是用一个实例来介绍系列化和反序列化:
    
    
    
实现对象的序列化和反序列化(ObjectOutputStream和  ObjectInputStream)如下图:
    

总结:在序列化的时候,要在被序列化的类中添加一个变量为serialVersionUID的数值,好处就是当这个类在被序列化的时候,就会用这个值进行序列化,反序列化也是如此。不定义此变量也是可以的,系统会帮你进行创建 serialVersionUID值。当你对序列化类进行修改数值的时候,这个是就会跟着变化,当它再次被反序列化的时候,就会出现应用的crash掉。所以,建议把该值定义为成员变量。
其次用transient关键字标记的成员变量不参与序列化的过程。

Parcelable接口:
    通过Parcelable接口来序列化和反序列化的实例如下:
    public class User implements Parcelable{

    public int userId;
    public String userName;


    public User(int userId, String userName) {
        super();
        this.userId = userId;
        this.userName = userName;
    }

    public User(Parcel source) {
        int userId = source.readInt();
        String userNameString = source.readString();
        source.readParcelable(Thread.currentThread().getContextClassLoader());
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    /**
     * 序列化调用
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {

    }
    /**
     * 反序列化调用
     */
    public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {

        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}


serializable和Parcelable的区别:
    serializable是java中的序列化接口,使用起来简单但是开销很大,序列化和反序列化的过程需要大量的I/O操作。
    Parcelable是android的序列化方式,因此更适合在android平台上,缺点就是使用起来有点麻烦,但是效率很高。android推荐的序     列化方式。通过Parcelable将对象序列化到存储设备中或者将对象序列化后通过网络传输也都是可以的,但是这个过程是稍显复杂         的。因此在这两种下建议大家使用serializable。

Binder:
      Binder实现了IBinder接口,Binder是android中的一种跨进程的通信方式,Binder还可以理解为是一个虚拟的威力设备,设备驱动是/dev/binder。

android中的IPC方式:
    使用Bundle:
        通过Bundle对象可以传输数据,是因为 Bundle实现了Parcelable接口,所以就可以方便的在不同进程中传输数据。
    
    使用文件共享:
        总结:在文件共享数据的时候要 注意的是读写的并发问题,尽量避免同时读写一个文件来造成文件的混乱。在这里说一下android中的sharepreferrnces的读写问题,在android中对 sharepreferrnces的读写,系统是做了缓存,但是在高并发的情况下还是会产生数据的丢失问题。

使用Messenger
    通过在不同的进程中传递Messenger对象,在Messenger中放入我们需要传递的数据,就可以实现数据在进程间传递了。Messenger是一种轻量级的IPC方案,他的底层实现是AIDL。通过下面的两个构造函数可以看出:
    

    下面是 Messenger工作的原理图:
     

使用AIDL:
    



第二章总结:左右进程间通信的方式和优缺点.
    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值