返回
从Android 8.0开始,App跨进程发送广播的有效手段
Android
2024-02-17 06:38:50
Android 8.0及其以上版本的应用广播概述
在 Android 8.0 及以上版本中,为了提高安全性,对广播的使用进行了更严格的限制。静态注册的广播接收器不再能够接收来自其他应用程序的广播,除非它们使用 EXPORTED
标志导出。而部分系统广播,则直接被禁止静态注册。
为了解决这些问题,Android 8.0 引入了一种新的广播机制:本地广播 。本地广播只会在应用程序的进程内传递,不会发送到其他应用程序。这使得它成为跨应用(进程)发送广播的理想选择。
使用步骤:
- 创建一个新的
LocalBroadcastManager
对象。 - 使用
registerReceiver()
方法注册一个广播接收器。 - 使用
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)来匹配相应的广播接收器。