美文网首页
021 Android多进程-综述

021 Android多进程-综述

作者: 凤邪摩羯 | 来源:发表于2021-01-19 14:46 被阅读0次

    022 Android多进程-序列化-Serializable和Parcelable
    023 Android多进程-序列化-ProtocolBuffer
    024 Android多进程-Messenger与Message
    025 Android多进程-Bundle
    026 Android多进程-文件共享
    027 Android多进程-ContentProvider
    028 Android多进程-Socket
    029 Android多进程-AIDL-使用
    029 Android多进程-AIDL-原理
    029 Android多进程-Binder连接池
    030 Android多进程-Binder-综述-1
    030 Android多进程-Binder-综述-2
    030 Android多进程-Binder-为什么用Binder1
    030 Android多进程-Binder-为什么用Binder2
    031 Android多进程-ps进程命令
    032 Android多进程-进程状态的切换
    032 Android多进程-进程生命周期
    033 Android多进程-进程优先级ADJ算法
    034 Android多进程-共享内存

    一. 什么是多进程?

    多进程就是多个进程的意思,那么什么是进程呢?

    当一个Android应用在开始运行时,系统会为它创建一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名。

    进程的特点:

    • 进程是系统资源和分配的基本单位,而我们常见的线程是调度的基本单位。
    • 每个进程都有自己独立的资源和内存空间
    • 其它进程不能任意访问当前进程的内存和资源
    • 系统给每个进程分配的内存会有限制

    Android是支持多进程的,当我们需要时,可以利用多进程了,那么什么场景时候多进程呢

    类似音乐类、跑步健身类、手机管家类等长时间需要在后台运行的应用,也就是常驻后台任务的应用。

    这些应用的特点就是,当用户切到别的应用,或者关掉手机屏幕的时候,应用本身的核心模块还在正常运行,提供服务。如果因为手机内存过低,或者是进程重要性降低,导致应用被杀掉,后台服务停止,对于这些应用来说,就是灭顶之灾。合理利用多进程,将核心后台服务模块和其他UI模块进行分离,保证应用能更稳定的提供服务,从而提升用户体验。

    二. 创建多进程

    Android多进程创建很简单,只需要在AndroidManifest.xml的声明四大组件的标签中增加”android:process”属性即可。命名之后,就成了一个单独的进程。

    process分私有进程和全局进程:

    • 私有进程的名称前面有冒号,例如:
    <service android:name="yb.demo.myProcesses.MusicService"
                android:process=":musicservice"/>
    
    
    • 全局进程的名称前面没有冒号,例如:
    <service android:name="yb.demo.myProcesses.MusicService"
                android:process="yb.demo.myProcesses.musicservice"/>
    
    

    为了节省系统内存,在退出该Activity的时候可以将其杀掉(如果没有人为杀掉该进程,在程序完全退出时该进程会被系统杀掉)。

    三. 多进程间的通信

    IPC:InterProcess Communication,即进程间通信。

    我们知道,同一个进程的多个线程是共享该进程的所有资源,但多个进程间内存是不可见的,也就是说多个进程间内存是不共享的。那么进程间是如何进行通信的呢?

    Android中,有多种方法可以实现进程间的通信,这里先放一个未完成的思维导图,后面细学的时候会完善此图。

    image
    • AIDL(Android Interface Definition Language,Android接口定义语言)
      大部分应用程序不应该使用AIDL去创建一个绑定服务,因为它需要多线程能力,并可能导致一个更复杂的实现。
    • Content Provider
      ContentProvider为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的
    • Socket
      Socket 也称为“套接字”,是网络通信中的概念,两个进程可以通过 Socket 来实现信息的传输,Socket 本身可以支持传输任意字节流的。
    • Bundle (A mapping from String values to various Parcelable types)
      Bundle和Map类型有异曲同工之妙,同时实现了Parcelable接口,那么显然,它支持进程间通讯,常常与Messenger结合使用。
    • 文件
      通过文件共享的方式实现。
    • Messenger
      利用Handler实现,常常与Bundle结合使用。(适用于多进程、单线程,不需要考虑线程安全),其底层基于AIDL。
    • Binder
      Binder是一种基于Client-Server通信模式的通信方式,传输过程只需要一次拷贝,可以为发送方添加UID/PID身份,支持实名Binder和匿名Binder,安全性高。

    IPC的实现方式这里只做简单的介绍,后面会议专题的方式对各种方式进行深入的研究。

    四、结语

    IPC的方式多种多样,各有优势,至于要选择哪一种方式,需要根据实际情况,判断优劣,适当选择。

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

    相关文章

      网友评论

          本文标题:021 Android多进程-综述

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