返回

从Android 8.0开始,App跨进程发送广播的有效手段

Android

Android 8.0及其以上版本的应用广播概述

在 Android 8.0 及以上版本中,为了提高安全性,对广播的使用进行了更严格的限制。静态注册的广播接收器不再能够接收来自其他应用程序的广播,除非它们使用 EXPORTED 标志导出。而部分系统广播,则直接被禁止静态注册。

为了解决这些问题,Android 8.0 引入了一种新的广播机制:本地广播 。本地广播只会在应用程序的进程内传递,不会发送到其他应用程序。这使得它成为跨应用(进程)发送广播的理想选择。

使用步骤:

  1. 创建一个新的 LocalBroadcastManager 对象。
  2. 使用 registerReceiver() 方法注册一个广播接收器。
  3. 使用 sendBroadcast() 方法发送一个广播。

局部广播的使用方法

注册本地广播接收器

// 创建一个新的 LocalBroadcastManager 对象。
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);

// 使用 registerReceiver() 方法注册一个广播接收器。
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.android.myapp.CUSTOM_ACTION");
manager.registerReceiver(receiver, filter);

发送本地广播

// 创建一个新的 Intent 对象。
Intent intent = new Intent("com.example.android.myapp.CUSTOM_ACTION");

// 使用 sendBroadcast() 方法发送一个广播。
manager.sendBroadcast(intent);

使用隐式意图跨应用程序发送广播

也可以使用隐式意图跨应用程序发送广播。隐式意图不需要显式指定目标应用程序,而是根据动作(action)和数据(data)来匹配相应的广播接收器。

使用隐式意图发送广播

// 创建一个新的 Intent 对象。
Intent intent = new Intent();
intent.setAction("com.example.android.myapp.CUSTOM_ACTION");
intent.setData(Uri.parse("http://www.example.com"));

// 使用 sendBroadcast() 方法发送一个广播。
context.sendBroadcast(intent);

使用隐式意图注册广播接收器

// 创建一个新的 IntentFilter 对象。
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.android.myapp.CUSTOM_ACTION");
filter.addDataScheme("http");

// 使用 registerReceiver() 方法注册一个广播接收器。
context.registerReceiver(receiver, filter);

结束语

从 Android 8.0 开始,App 跨应用(进程)发送广播必须使用局部广播或者隐式意图,否则将会抛出异常。局部广播仅在应用程序的进程内传递,不会发送到其他应用程序。隐式意图不需要显式指定目标应用程序,而是根据动作(action)和数据(data)来匹配相应的广播接收器。