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)。以下示例中的广播接收器会记录并显示广播的内容

java 复制代码
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项目中清单中声明广播接收器

kotlin 复制代码
  <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项目发送一条广播消息,代码如下。

kotlin 复制代码
 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 组件的通信方式,需要组件处于活动状态才能接收到广播。

相关推荐
selt7914 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript
Yao_YongChao5 小时前
Android MVI处理副作用(Side Effect)
android·mvi·mvi副作用
非凡ghost6 小时前
JRiver Media Center(媒体管理软件)
android·学习·智能手机·媒体·软件需求
席卷全城6 小时前
Android 推箱子实现(引流文章)
android
齊家治國平天下6 小时前
Android 14 系统中 Tombstone 深度分析与解决指南
android·crash·系统服务·tombstone·android 14
maycho1238 小时前
MATLAB环境下基于双向长短时记忆网络的时间序列预测探索
android
思成不止于此8 小时前
【MySQL 零基础入门】MySQL 函数精讲(二):日期函数与流程控制函数篇
android·数据库·笔记·sql·学习·mysql
brave_zhao9 小时前
达梦数据库(DM8)支持全文索引功能,但并不直接兼容 MySQL 的 FULLTEXT 索引语法
android·adb
sheji34169 小时前
【开题答辩全过程】以 基于Android的网上订餐系统为例,包含答辩的问题和答案
android
easyboot9 小时前
C#使用SqlSugar操作mysql数据库
android·sqlsugar