Android 跨进程之间通信(IPC)方式之BroadcastReceiver

Android 跨进程之间通信

  1. Android 跨进程之间通信(IPC)方式之BroadcastReceiver
  2. Android 跨进程之间通信(IPC)方式之ContentProvider

前言

广播是 Android 系统中一种强大的通信机制,它允许应用程序中的不同组件之间进行信息交流,甚至跨越不同应用程序之间进行通信。它类似于一个发布者-订阅者模式,其中一个组件可以发送广播,而其他组件则可以注册监听并在特定条件下接收这些广播消息。

广播可以被用来传递各种类型的信息,比如设备状态的变化、系统事件、应用内部的消息等。它的灵活性和普适性使得开发者可以利用广播来实现诸如实时更新UI、触发特定操作、响应系统级事件等功能。通过广播,Android 应用程序可以与用户进行无缝互动,并实现多个组件之间的松耦合通信,这对于实现复杂的应用逻辑和提升用户体验至关重要。


一、关于系统广播

系统会在发生各种系统事件时自动发送广播,例如当系统进入和退出飞行模式时。系统广播会被发送给所有同意接收相关事件的应用。
广播消息本身会被封装在一个 Intent 对象中,该对象的操作字符串会标识所发生的事件(例如 android.intent.action.AIRPLANE_MODE)。该 Intent 可能还包含绑定到其extra 字段中的附加信息。例如,飞行模式 intent 包含布尔值 extra 来指示是否已开启飞行模式。

二、如何利用BroadcastReceiver跨进程通信

我们创建两个项目,一个是项目A,另一个是项目B。用两个不同项目来模拟两个进程之间的通信效果,在

1.创建广播接收器

在A项目中创建 BroadcastReceiver 子类并实现 onReceive(Context, Intent)。以下示例中的广播接收器会记录并显示广播的内容

public class AReceiver extends BroadcastReceiver {
    private static final String ACTION_CUSTOM_BROADCAST_B = "com.xzhy.ademo.ACTION_CUSTOM_BROADCAST_B";
    private static final String EXTRA_MESSAGE = "message";
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_CUSTOM_BROADCAST_B.equals(action)) {
            String message = intent.getStringExtra(EXTRA_MESSAGE);
            Log.d("AReceiver", "--- AReceiver onReceive message: "+message);
        }
    }
}

2.清单文件中声明注册

在A项目中清单中声明广播接收器

  <receiver android:name=".AReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.xzhy.ademo.ACTION_CUSTOM_BROADCAST_B" />
            </intent-filter>
  </receiver>

3.发送广播

Android 为应用提供三种方式来发送广播:

  • sendOrderedBroadcast(Intent, String) 方法一次向一个接收器发送广播。当接收器逐个顺序执行时,接收器可以向下传递结果,也可以完全中止广播,使其不再传递给其他接收器。接收器的运行顺序可以通过匹配的 intent-filterandroid:priority 属性来控制;具有相同优先级的接收器将按随机顺序运行。
  • sendBroadcast(Intent) 方法会按随机的顺序向所有接收器发送广播。这称为常规广播。这种方法效率更高,但也意味着接收器无法从其他接收器读取结果,无法传递从广播中收到的数据,也无法中止广播。
  • LocalBroadcastManager.sendBroadcast 方法会将广播发送给与发送器位于同一应用中的接收器。如果您不需要跨应用发送广播,请使用本地广播。这种实现方法的效率更高(无需进行进程间通信),而且您无需担心其他应用在收发您的广播时带来的任何安全问题。

我们在B项目中用sendBroadcast(Intent) 向A项目发送一条广播消息,代码如下。

 Intent intent = new Intent("com.xzhy.ademo.ACTION_CUSTOM_BROADCAST_B");
 intent.setPackage("com.xzhy.ademo"); // 设置接收广播的应用包名
 intent.putExtra("message", "Hello,这里是B面 Demo 的默认消息~");
 sendBroadcast(intent);

先打开A项目保持在后台运行,再打开B项目会发行A项目的日志显示已经收到了B发送的广播消息。既然B发送广播给A能够正常送达,那么A发送给B消息只要和上面的步骤一样就可以做到A、B进程之间相互通信了。
在这里插入图片描述

4.杀掉进程测试

在A进程被系统意外杀死或者说主动关闭掉的话,B通过广播发送消息给A,通过日志可以发现A是无法收到消息。

在这里插入图片描述

B日志显示已经发送了广播消息,但是A的日志情况显示没有收到B发送的消息

在这里插入图片描述

小结

本文简单的介绍了如何利用广播在两个不同进程内进行相互通信操作,但是广播的接收者必须在运行状态下才能接收到广播消息。当一个进程被杀死时,它注册的广播接收者也会随之销毁,因此其他进程发送的广播消息将无法被接收到。因为广播是一种基于 Android 组件的通信方式,需要组件处于活动状态才能接收到广播。

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android 中的进程通信IPC)有以下几种方式: 1. Binder:是 Android 系统中最常用的 IPC 机制,它是一种高效、稳定、安全的进程通信方式,常用于 Service 和 Activity 之间通信。 2. Messenger:基于 Binder 实现的进程通信方式,可以向其他进程发送 Message。 3. AIDL:也是基于 Binder 实现的进程通信方式,使用 AIDL 定义接口,然后在客户端和服务端之间传递数据。 4. ContentProvider:提供了一种在多个应用程序之间共享数据的方式,其他应用程序可以通过 ContentResolver 访问 ContentProvider 中的数据。 5. Socket:通过套接字进行进程通信,常用于网络通信和本地进程通信。 6. BroadcastReceiver:通过 Intent 进行进程通信,可以在不同的应用程序之间传递消息。 以上是 Android 中常见的进程通信方式,不同的场景可以选择不同的方式来实现进程通信。 ### 回答2: Android进程通信方式有以下几种: 1. 使用Bundle:Bundle是一种存储数据的容器,在Android中可以用于进程通信。通过将数据存储在Bundle对象中,然后在不同的进程间传递Bundle对象来实现通信。 2. 使用Intent:Intent是一种在Android中用于传递消息和数据的对象。通过在不同的进程间发送Intent来实现进程通信。 3. 使用AIDL(Android Interface Definition Language):AIDL是一种用于定义进程接口的语言。通过在服务端定义AIDL接口,然后在客户端通过AIDL来调用服务端提供的接口,实现进程通信。 4. 使用Messenger:Messenger是一种轻量级的进程通信机制,它基于Handler和Binder机制。通过在不同的进程间传递Messenger对象,实现进程通信。 5. 使用ContentProvider:ContentProvider是一种用于在不同应用程序之间共享数据的组件。通过在ContentProvider中实现数据的读写操作,其他应用程序可以通过ContentResolver来访问和共享这些数据,实现进程通信。 通过以上几种方式Android应用程序可以实现不同进程间的通信,以满足不同的需求和场景。 ### 回答3: Android进程通信有以下几种方式: 1. Binder机制:Binder是Android中一种高效的进程通信机制,它是基于C/S架构的,通过将服务以Binder驱动的方式注册到系统Service Manager中,实现一对多或多对多的进程通信。 2. AIDL(Android Interface Definition Language):AIDL是Android进程通信接口定义语言,通过定义接口及数据类型,在服务端和客户端之间进行通信。AIDL框架提供了支持程序的IPC(Inter-Process Communication)功能。 3. Messenger:Messenger是基于AIDL封装的一种进程通信方式。通过Messenger可以实现进程间的消息传递,但是一次只能传递一个消息,不能进行数据的交互操作。 4. ContentProvider:ContentProvider是Android提供的一种进程通信方式,它通过对外共享数据的方式实现进程间的数据交换。ContentProvider可以对外提供访问数据库等共享数据的接口,并通过URI进行数据的增删改查操作。 5. Broadcast Receiver:广播接收器是一种全局的事件通知机制,可以在不同进程之间进行消息的发送和接收。通过广播接收器可以实现简单的进程通信,但是通信的内容只能是Intent对象。 6. Socket:Socket是一种传统的网络通信方式,通过网络套接字进行进程通信。在Android中,可以使用Socket实现不同进程之间通信,但是相对于其他方式,Socket的效率较低。 以上是常见的Android进程通信方式,根据具体的需求和场景选择适合的方式可以有效实现进程间的数据交换和消息传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值