• 理论修炼---初窥Android IPC机制



    前言

      写这篇文章的意义是梳理对AndroidIPC机制的理解,主要是上层原理及使用


    IPC的含义为进程间通信或者跨进程通信,也就是数据交换,进程和线程的区分从操作系统角度来说,线程是CPU的最小调度单元,同时也是一种有限资源,进程指的是一个执行单元在Android上指一个应用,进程可以包含很多个线程(包含与被包含的关系)通常一个应用也就进程都会包含至少一个线程,就是我们熟悉的UI线程(主线程)如果进程需要执行大量的耗时任务这个时候都在UI线程做就会造成界面无法响应(ANR),就需要我们用子线程去做这些耗时的任务。

    1. Android中多进程的创建与常见问题

      Android中使用多进程的方法常规就是在AndroidManifest是指定Android:process属性,不能给一个线程或实体类指定运行时所在进程,或者去JNI层fork一个进程。
      指定Android:process属性需要注意的地方:

    • 进程名以:“:” 开头进程属于应用私有进程
    • 进程名以:“.” 开头的进程属于全局进程

    1.1 使用多进程会造成的问题

    1. 静态成员和单例模式完全失效
    2. 线程同步机制完全失效
    3. SharedPreferences可靠性下降
    4. Application会多次创建
      静态成员和单例模式完全失效原因
      Android会为每个进程都分配一个独立的虚拟机,这就意味着不同的虚拟机在内存分配的地址空间不同,会导致在不同虚拟机访问同一个类对象会产生多个副本,如果我们要修改这个对象也只是修改当前进程中的副本对象,影响的只是当前进程,不会影响其他进程的副本对象。
      线程同步机制完全失效
      因为不同进程都有独立的内存空间,所以没有在同一块内存了,锁任何东西都无法保证线程同步,锁的也只是当前进程的副本对象而不是同一个对象。
      SharedPreferences可靠性下降
      SharedPreferences底层通过读写xml文件来实现,会存在一定的并发可能,SharedPreferences不支持两个进程同时进行读或写操作。
      Application会多次创建
    5. 系统创建进程同时会分配虚拟机,这个过程与启动应用是一致的,可以理解为系统又把应用重启了一遍
    6. 既然重新启动了那么创建新的Application就是正常的了
    7. 简单直白的来说,在同一个进程的组件是属于同一个虚拟机和Application,那么在不同进程中运行的组件就属于不同的虚拟机和Application

    2. 基础概念

    在跨进程通信中我们需要先了解以下三个内容:

    • Serializable
    • Parcelable
    • Binder
        为什么要了解Serializable,Parcelable,熟悉的都知道这两个都是为对象提供序列化的一种方式,两者一个是Java常用一个是Android推荐,为什么要重点圈出这个呢?是因为在IPC通信过程中对象的序列化与反序列化与这两个是密不可分的,我们可以选择其一就可,这里推荐还是用Parcelable。
        Serializable,Parcelable的区别在于Serializable的序列化与反序列化过程有大量的I/O操作,Parcelable是Android序列化方式就是用的麻烦一点,Parcelable主要用在内存序列化上但效率高。总结:想简单一点用Serializable,高效一点用Parcelable

    2.1 Binder

    关于binder的使用本来想写的但是搜了一下网上实在太多了就不造轮子式写了

    关于Binder的文章网上到处是越看越晕,关于binder是什么可以从以下几个角度来看:

    1. Binder是Android的一个类,实现了Ibinder接口
    2. IPC角度来说Binder是Android中的一种跨进程通信方式
    3. Binder也可以理解为一种虚拟的物理设备,设备驱动在/dev/binder
    4. 从Android框架层来看Binder是serviceManager连接各种Manager(ActivityManager、WindowManager等)和相应ManagerService的桥梁
    5. 从应用层来看Binder是客户端和服务端通信的媒介

    3. Android中可使用的IPC方式

    1. Bundle
    2. 文件共享
    3. Messenger
    4. AIDL
    5. 使用Content Provider
    6. Socekt

    4 不同的IPC优缺点,及使用方式

    在这里插入图片描述
    这篇文章的代码示例链接:代码示例

  • 相关阅读:
    SpringCloud 核心组件Nacos【配置管理&配置拉取】第4章
    智能机器人云控平台
    Spring5从入门到精通(一)
    Linux的十个常用命令
    32、多租户(multi-tenancy)
    怎样正确做 Web 应用的压力测试?
    哈工大校园网显示IP地址错误连接不上
    Razor、ASPX 语法分析
    常用锁原理的介绍(上)
    CUDA out of memory.(已解决)+Windows和Linux查看占用显存的程序
  • 原文地址:https://blog.csdn.net/qq_40616261/article/details/125856062