Android 跨进程之间通信
-
Android 跨进程之间通信(IPC)方式之ContentProvider
文章目录
- [Android 跨进程之间通信](#Android 跨进程之间通信)
- 前言
- 一、关于系统广播
- 二、如何利用BroadcastReceiver跨进程通信
- 小结
前言
广播是 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-filter
的android: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 组件的通信方式,需要组件处于活动状态才能接收到广播。