Android IPC机制-小试牛刀

前言

觉得自己已经大二下学期了, Android方面的知识仍然是停滞不前,明年就要去找实习了,感觉十分的虚,项目也做得差差不多,总感觉自己在做重复的东西,学到的东西不是很多,所以最近买了本《安卓开发艺术》,据说这本书是进阶用的,所以我打算研读这本书,这本书里的知识基本是面试所问的基础知识。

  • 简介

    IPC:Inter-Process Communication,简称:进程间的通信。

    • 进程和线程

      • 进程:一个执行单元,一个程序、应用。

      • 线程:CPU调度最小单元。

    注: 任何操作系统都会有IPC机制。

  • 需要了解的知识

    • 多进程

      • 开启多进程:

        这里的多进程是指一个应用中有多个进程。

        首先我们就先创建两个进程吧,在AndroidManifest.xml中对四大组件使用android:process属性, 除此之外没有别的方法, 其实是有的(通过JNI在native层去fork一个新的进程),只不过太复杂了.

        <activity
            android:name="com.thatnight.MainActivity"
            ...
            android:process=":remote"/>
        
        <activity
            android:name="com.thatnight.SecondActivity"
            ...
            android:process="com.thatnight.remote"
            />

        通过上面的android:process的属性, 分别为MainAcitivity和SecondActivity设置了两个进程, 一个是”com.thatnight:remote”, 另一个是”com.thatnight.remote”

        上面的”:remote”和”.remote”是有区别的

        :remote : 当前的进程名前面附加当前的报名, 并且表示当前的进程是私有进程, 其他应用组件不可以跑到他的进程中.属于全局进程.

      • 多线程模式的运行机制:

        首先我们开启两个进程, 就犹如上面的MainActivity和SecondActivity,下面先新建一个类, UserManager

        public class UserManager{
            public static int sUserId=1;
        }

        我们在MainActivity的onCreate()方法把这个 id改成2, 那么再启动SecondActivity的onCreate()方法打印出来,结果是:

        sUserId=2;

        为什么呢?

        答: SecondActivity运行在一个单独的进程, Android为每个进程都分配一个独立的虚拟机, 不同的虚拟机在内存分配上有不同的地址空间.

        总结: 多进程会造成如下几方面的问题

        1. 静态成员和单例模式完全失效

        2. 线程同步机制完全失效

        3. SharedPreferences的可靠性下降: SharedPreferences不支持两个进程同时去执行写操作

        4. Application会多次创建: 当一个组件跑在新进程,相当于启动一个应用,所以会创建Application.


  • 基础概念介绍

    • Serializable接口

      这是一个Java提供的序列化接口, 使用起来相当简单,**只需要在类中声明指定一个类似下面的标识, 即可自动实现默认的序列化:

      public class Book implements  Serializable {
      
          private static final long serialVersionUID=8711368828010083044L;
      
          private String name;
          private String author;
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getAuthor() {
              return author;
          }
      
          public void setAuthor(String author) {
              this.author = author;
          }
      }
    • Parcelable接口

      直接上代码吧!

      public class Book implements Parcelable {
      
          private String name;
          private String author;
      
      
          public Book(){
      
          }
      
          protected Book(Parcel in) {
              name = in.readString();
              author = in.readString();
          }
      
          public static final Creator<Book> CREATOR = new Creator<Book>() {
              @Override
              public Book createFromParcel(Parcel in) {
                  return new Book(in);
              }
      
              @Override
              public Book[] newArray(int size) {
                  return new Book[size];
              }
          };
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getAuthor() {
              return author;
          }
      
          @Override
          public int describeContents() {
              return 0;
          }
      
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              dest.writeString(name);
              dest.writeString(author);
          }
      }        

      序列化的功能由writeToParcel方法来完成, 最终通过Pacel中的一系列write方法来完成;

      反序列化由CREATOR来完成, 通过一系列Pacel的read方法来完成反序列.

      describeContents: 内容描述功能,一般返回0.

      提示: Serializable接口是Java的, 用起来简单但是开销很大, 所以不适合,然后就有, ==Parcelable是Android的序列化方式==, 所以我们首选Parcelable接口, 虽然有点复杂.

    • Binder

      首先这个的发音, 一开始我读:冰的, 后来师兄说了下是:拜的,我就百度了下

      binder 英[ˈbaɪndə(r)] 美[ˈbaɪndɚ] —> 拜的

      Binder简单来说就是一个类, 实现了IBinder接口.

      Binder这个东西还真的是有点难以理解, 很是复杂, 所以我看了很多天.那我先简单地步骤解释:

      1. 首先创建AIDL的流程, 我之前有写: AIDL详解
      2. 打开app\build\generated\source\aidl\debug\com\rcd\democomponents目录下的BookManager.java

        代码十分的长, 大家可以整理一下代码再看.

      3. Binder的工作机制

        这里写图片描述

        关于Binder呢,我这里不详细讲了, 篇幅有限,还是给更多的时间去了解一下IPC机制比较好.


  • Android中的IPC方式

    • 选择合适的IPC方式

      名称优点缺点使用场景
      Bundle简单易用只能传输Bundle四大组件的进程间通信
      文件分享简单易用不适合高并发场景,并且无法做到进程间的即时通信无并发访问交换简单的数据实时性不高的场景
      AIDL功能强大,支持一对多发通信, 支持实时通讯使用复杂,需要处理好线程同步一对多通信且有RPC需求
      Messenger功能一般,支持一对多串行通信,支持实时通信不能很好处理高并发清醒,不支持RPC,数据通过Message进行传输,只能传输Bundle低并发的一对多即时通信, 无RPC需求,或者无需要返回结果的RPC需求
      ContentProvider在数据源访问页面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作受约束的AIDL,主要提供数据操作一对多的进程间通信
      Socket功能强大,可以通过网络传输字节流,支持一对多细节稍微繁琐,不支持直接的RPC网络数据交换

  • 未完待续

    此篇文章主要了解一下Android的IPC机制的基础知识,下一篇文章将会详细介绍IPC的方式.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值