美文网首页
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