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

相关推荐
sun0077005 小时前
android ndk编译valgrind
android
AI视觉网奇6 小时前
android studio 断点无效
android·ide·android studio
jiaxi的天空6 小时前
android studio gradle 访问不了
android·ide·android studio
No Silver Bullet7 小时前
android组包时会把从maven私服获取的包下载到本地吗
android
catchadmin7 小时前
PHP serialize 序列化完全指南
android·开发语言·php
tangweiguo030519879 小时前
Kable使用指南:Android BLE开发的现代化解决方案
android·kotlin
00后程序员张11 小时前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
柳岸风12 小时前
Android Studio Meerkat | 2024.3.1 Gradle Tasks不展示
android·ide·android studio
编程乐学12 小时前
安卓原创--基于 Android 开发的菜单管理系统
android
whatever who cares15 小时前
android中ViewModel 和 onSaveInstanceState 的最佳使用方法
android