Android 中常用的跨进程通信和跨线程通信方法总结

        通常一个APP只运行在一个进程中,一个进程中可包含多个线程,通常是一个主线程(UI线程)和多个子线程(工作线程)。当然一个APP也可以拥有多个进程,最常见的就是通过android:process属性给某个服务Service设置独立进程,用于保活或者解耦等。比如:

 <service
            android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
            android:label="dexopt"
            android:process=":dexopt" />

有多个进程和线程就会涉及到跨进程通信或跨线程通信,用户状态同步,UI刷新等。下面介绍几种常用的跨进程通信和跨线程通信方法。通常跨进程通信方法也可以用于线程中通信,只是有点大材小用,看具体业务场景来定。

一、跨线程通信:

  1. Handler和消息队列(Handler and Message Queue):

    • 优点:简单易用,适合在主线程与工作线程之间进行通信。通过Handler发送消息,消息会被放入消息队列中,然后由目标线程的Looper按顺序处理消息。
    • 缺点:不适合高频率的通信,处理大量消息时可能会造成阻塞。
  2. AsyncTask:

    • 优点:方便进行简单的异步操作,在主线程和工作线程之间进行通信。内部封装了Handler和线程池的机制,简化了异步任务的编写。
    • 缺点:适用于轻量级的异步操作,不适合长时间运行的任务。
  3. HandlerThread:

    • 优点:提供了一个带有消息循环的线程,可以方便地在工作线程中处理消息。适合用于需要长时间运行的后台任务。
    • 缺点:需要手动管理线程的生命周期,包括启动、停止和销毁。
  4. BroadcastReceiver和广播(BroadcastReceiver and Broadcast):

    • 优点:适用于跨组件之间的通信,可以在应用内或应用间传递广播消息。可以通过发送广播来触发接收者的响应。
    • 缺点:广播是全局的,可能会导致性能问题和安全风险。对于频繁的通信,建议使用其他方式。
  5. EventBus是一种用于实现发布-订阅模式的开源库
    • 优点:简化了线程间通信:EventBus提供了一种简单的方式来进行线程间通信,开发人员无需手动处理线程切换和消息传递的细节。松耦合的组件通信:通过EventBus,组件之间可以进行松耦合的通信,发送者和接收者之间没有直接的依赖关系。线程切换方便:EventBus允许在发布事件时指定事件的接收线程,从而方便地在不同线程之间切换。

    • 缺点:难以追踪和调试:由于EventBus采用了发布

二、跨进程通信(IPC): 

        

  1. BroadcastReceiver和广播(BroadcastReceiver and Broadcast):

    1. 优点:适用于跨组件之间的通信,可以在应用内或应用间(跨进程)传递广播消息。可以通过发送广播来触发接收者的响应。
    2. 缺点:广播是全局的,可能会导致性能问题和安全风险。对于频繁的通信,建议使用其他方式。
  2. AIDL(Android Interface Definition Language):

    1. 优点:适用于跨进程通信,支持双向通信和复杂数据类型。可以定义接口和方法,使得进程之间可以调用对方的方法。
    2. 缺点:相对复杂,需要手动编写AIDL文件和实现跨进程通信的逻辑。通过底层Binder机制实现
  3. ContentProvider:

    1. 优点:用于实现数据共享和跨进程通信。可以通过ContentResolver查询、插入、更新和删除数据。
    2. 缺点:相对复杂,需要定义URI和数据访问接口,适用于数据共享而不适用于频繁的通信

      4.Socket通信:

                1.优点:网络通信能力:Socket通信可以在网络层面上进行进程间通信,适用于跨网络的通信需求。广泛支持:Socket是一种标准的通信机制,在不同平台和编程语言中都有广泛的支持。

                2.  缺点:复杂性:使用Socket进行进程间通信需要编写底层网络通信代码,包括建立连接、数据传输和错误处理等,相对复杂。安全性:Socket通信可能面临网络攻击和数据泄露等安全风险,需要进行额外的安全措施。

  1. 5.Messenger:

    • 优点:基于AIDL实现的轻量级进程间通信机制,支持双向通信。通过Handler和Message进行消息传递。

      Messenger是一种轻量级的IPC方案,它的底层实现其实就是AIDL.跨进程通信使用Messenger时,Messenger会将所有服务调用加入队列,然后服务端那边一次处理一个调用,不会存在同时调用的情况.而AIDL则可能是多个调用同时执行,必须处理多线程问题.

      对于大多数应用,跨进程通信无需一对多,也就是无需执行多线程处理,此时使用Messenger更适合.

    • 缺点:只支持一对一的通信,不能实现一对多的通信。

        

猜你喜欢

转载自blog.csdn.net/HuanWen_Cheng/article/details/132710767