IPC机制(一)

参考书籍:
Android开发艺术探索
注:京东链接https://item.jd.com/11760209.html

IPC简介

* IPC
Inter-process Communication:进程间通信和跨进程通信

* 线程和进程
1.线程:进程中程序的执行单元,但是线程本身依靠程序运行
2.进程:执行中的程序,其中一个进程至少包含一个线程

* Android进程通信方式
1.Binder
2.Socket(实现2个终端间的通信,或者2个进程间的通信)

* Android多进程应用场景
1.某些模块需要运行在单独的进程中
2.扩大应用的可用最大内存(早期版本是16M)
3.当前应用需要向其他应用获取数据(如支付宝,微信)

Android多进程模式

* 通过在清单文件里面为四大组件声明android:process属性,就开启了多进程模式
* 进程名的两种命名方式
1.私有进程名:com.caesar.demo.SecondActivity:remote

2.普通全局进程名:com.caesar.demo.ThirdActivity.remote
 
    
注:
——>进程名以":"开头的进程属于当前应用的私有进程,其它应用组件不能和其在
   一个进程中;
——>普通的进程命名为全局进程通过ShareUID来实现将2个应用跑在一个进程中;
   (1)两个应用跑在一个进程前提:ShareUID相同,签名相同;
   (2)两个应用在一个进程就可以共享数据,他们就像一个应用的两个部分

多进程模式的运行机制

* Android中不同的进程会分配独立的虚拟机,不同的虚拟机在内存分配上拥有不同的
地址空间

* 多进程会造成的问题:
1.静态成员和单例模式失效
2.线程同步机制完全失效
3.SharePreferences可靠性下降(SharePreference底层是通过读写xml实现的,
多进程会造成并发修改异常)
4.Application会多次创建.

* Android跨进程通信方式
1.Intent
2.基于Binder的Messenger和AIDL
3.Socket

IPC基础概念

Serializable接口(开销大-大量I/O读写操作,使用简单)
1.Serializable序列化过程:
(1)需要序列化的类
class User implements implements Serializable {
    //声明一个标识,反序列化会用到
    private static final long serialVersionUID = 519067123721295773L;
    
    public String userName;
    public int userAge;
    ------
}
(2)序列化对象(以流的形式将对象持久化到存储设备)
User user = new User("caesar",24);
ObjectOutputStream out = new ObjectOutputStream
            (new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();
(3)反序列化(从存储设备中读取对象)
ObjectInputStream out = new ObjectInputStream
            (new FileInputStream("cache.txt"));
User newUser = (User)in.readObject();
in.close();

注:
1.serialVersionUID作用:用于辅助序列化和反序列化的,序列化的
serialVersionUID只有和当前类的serialVersionUID相同才能被正常序列化
2.静态成员变量属于类不属于对象,不参与序列化过程;
用transient关键字修饰的变量不参与序列化过程
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;
    }

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

    //序列化
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(userId);
        out.writeString(userName);
        out.writeInt(isMale ? 1 : 0);
        out.writeParcelable(book,0);
    }

    //反序列化
    public static final Creator CREATOR = new Creator() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(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());
    }
}

注:
(1)序列化由writeToParcel()完成;
(2)反序列由CRETOR完成;
(3)book是另外一个可序列化对象,在反序列化中需要传递当前线程的
上下文类加载器。
Binder的使用和上层原理

你可能感兴趣的:(IPC机制(一))