美文网首页
Android IPC机制(进程间通讯)

Android IPC机制(进程间通讯)

作者: 从心开始的我 | 来源:发表于2019-05-08 17:28 被阅读0次

1. Android IPC简介

  • 基本概念
  1. IPC是Inter-Process Communication的缩写,含义是进程间通讯或者夸进程通讯,是指两个进程进行数据交换的过程.
  2. 线程是CPU调度的最小单元,同时线程是一种有限的系统资源.
  3. 进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用.

一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系

2. Android中的多进程模式

2.1 开启多进程模式

Android中使用多进程只有一种方法,就是给四大组件(Activity,Service,Receiver,ContentProvider)在manifest文件中指定android:process属性;

       <activity
            android:name="TestActivity"
            android:process=":remote"
            />
        <service
            android:name="TestService"
            android:process="com.test.myApp.remote"/>

        <receiver
            android:name="TestReceiver"
            android:process="com.test.myApp.remote"
            />
        <provider
            android:name="TestProvider"
            android:authorities="com.test.myApp.TestProvider"
            android:process="com.test.myApp.remote"/>

android:process=":remote" 该进程的完整名称是<包名:remote>,这样标示的进程属于当前应用的私有进程,其他应用的组件不可以和它运行在同一进程中

android:process="com.test.myApp.remote" 该进程的名称为com.test.myApp.remote,不以:开头的进程属于全局进程,其他应用通过ShareUID方式可以运行在同一个进程

Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据

2.2多进程运行机制

Android系统会为每个应用分配一个独立的虚拟机,或者说为每个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同地址控件,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本,并且多个副本间互不干扰,修改一个副本的值不对改变另外的副本的值


多进程下会有如下问题

  • 静态成员和单例模式完全失效
  • 线程同步机制完全失效
  • SharedPreferences 的可靠性下降
  • Application 会多次创建

3. IPC基础概念介绍

基础概念主要包含三方面内容:Serializable接口;Parclable接口和Binder
Serializable和Parclable接口可以完成对象的序列化,当我们用Intent和Binder传输数据时就需要使用Serializable和Parclable

3.1 Serializable接口
  1. Serializable实现方式
public class TestSerializableBean implements Serializable {

    private static final long serialVersionUID = -1460666235331419254L;
    public int userId;
    public String userName;
}
  1. 序列化和反序列化过程
        File file= new File(FileManager.getSdCardFileDir(),"cache.txt");
        FileManager.createFile(file);

        //序列化过程
        ObjectOutputStream outputStream = null;
        try {
            TestSerializableBean testSerializableBean = new TestSerializableBean(18, "xiaoming");
            outputStream = new ObjectOutputStream(new FileOutputStream(file.getAbsolutePath()));
            outputStream.writeObject(testSerializableBean);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //反序列化过程
        ObjectInputStream objectInputStream = null;
        try {
            objectInputStream = new ObjectInputStream(new FileInputStream(file.getAbsolutePath()));
            TestSerializableBean bean = (TestSerializableBean) objectInputStream.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (objectInputStream != null) {
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

serialVersionUID 是用来辅助序列化和反序列化,原则上序列化数据中的serialVersionUID和当前类的serialVersionUID相同才能被反序列化

3.2 Parcelable 接口

Parcelable 也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并通过Intent和Binder传递
实现方式

public class TestParcelableBean implements Parcelable {

    public int userId;
    public String userName;

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.userId);
        dest.writeString(this.userName);
    }

    public TestParcelableBean() {
    }

    protected TestParcelableBean(Parcel in) {
        this.userId = in.readInt();
        this.userName = in.readString();
    }

    public static final Creator<TestParcelableBean> CREATOR = new Creator<TestParcelableBean>() {
        @Override
        public TestParcelableBean createFromParcel(Parcel source) {
            return new TestParcelableBean(source);
        }

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

Parcelable和Serializable区别
Serializable:是Java中的序列化接口,使用简单但是开销很大,序列化和反序列化过程需要大量的I/O操作.
Parcelable:是Android中序列化方式,实现起来麻烦,但是效率很高

3.3 Binder(待续....)

相关文章

网友评论

      本文标题:Android IPC机制(进程间通讯)

      本文链接:https://www.haomeiwen.com/subject/dgemoqtx.html