开始

广播机制在程序之间的交互中使用,每个程序都可以发送和接收广播,在程序内也可通过广播实现 Activity 通信

广播的类型

  • 标准广播

    标准广播是一种异步执行的广播,广播发出后,所有 Receiver 都会同时接收到这条广播,该类型的广播无法被截断

  • 有序广播

    有序广播是一种同步执行的广播,广播的接收按 Receiver 的优先级决定,同时每个 Receiver 可以决定该广播是否继续传播

  • 显式广播

    显式广播是指定了要发送的应用程序的广播

  • 隐式广播

    隐式广播没有指定发送的应用程序,指定了一些信息,发送给符合信息的应用程序

广播的注册

广播注册分为动态注册和静态注册两种,动态注册可以实现灵活的广播注册和注销,但必须要程序启动后才能接收到广播。若要在程序未启动时,比如刚开机的情况下接受到系统的开机广播,就需要使用静态注册,但静态注册长期监听,消耗更多资源,因此大部分情况建议优先使用动态注册解决问题

定义广播接收器:自定义类继承 BroadcastReceiver,重写 onReceive 方法

1
2
3
4
5
6
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// ...
}
}

动态注册

在 Activity 运行时将一个 BroadcastReceiver 注册为接收器

  • 构造 IntentFilter 对象,调用 addAction() 添加 action,指定 Receiver 接收的广播类型
  • 构造接收器对象
  • 调用 registerReceiver(),传入接收器和 IntentFilter
  • 调用 unregisterReceiver() 注销接收器
1
2
3
4
5
6
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON); // 监听屏幕亮起
filter.addAction(Intent.ACTION_SCREEN_OFF); // 监听屏幕熄灭
MyReceiver receiver = new MyReceiver();
registerReceiver(receiver, filter); // 注册广播接收器
unregisterReceiver(receiver); // 注销广播接收器

静态注册

AndroidManifest.xmlapplication 标签中的 receiver 标签中注册

receiver 标签

  • name:指定自定义广播接收器类
  • exported:是否允许该 Receiver 接收本程序以外的广播
  • enabled:是否启用该 Receiver
  • intent-filter:在该标签中添加 action 标签来指定接收的广播类型

静态接收器由于会消耗资源一直监听,因此许多系统广播不允许静态接收器监听,允许监听的系统广播需要添加权限

静态接收器不能接收隐式广播

发送自定义广播

发送标准广播

构造 Intent 对象,传入自定义广播的 action 值,所有监听该 action 值的 Receiver 就会收到消息

1
2
3
4
5
6
7
8
9
10
11
// 发送广播
Intent intent = new Intent("com.example.myapplication.MY_BROADCAST");
// 对于静态接收器,不能接收隐式广播,因此需要设置广播发送的应用程序
// intent.setPackage(getPackageName())
sendBroadcast(intent); // 发送广播

// 注册接收器
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.myapplication.MY_BROADCAST");
registerReceiver(receiver, filter);

发送有序广播

在发送广播时调用 sendOrderedBroadcast() 发送有序广播,传入 intent 和关于权限的字符串,设为 null 即可

调用 abortBroadcast() 可将广播截断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 发送广播
Intent intent = new Intent("com.example.myapplication.MY_BROADCAST");
sendOrderedBroadcast(intent); // 发送有序广播

// 注册接收器
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.myapplication.MY_BROADCAST");
filter.setPriority(1000); // 设置接收器的优先级
registerReceiver(receiver, filter);

// 接收广播
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// ...
abortBroadcast(); // 截断广播
}
}

本地广播

本地广播是指只在本应用程序内发送和接收的广播,其他程序不能接收本程序的本地广播

通过 LocalBroadcastManager 来发送广播

1
2
3
4
5
6
7
// 获取LocalBroadcastManager实例
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
// 创建Receiver和IntentFilter...
manager.registerReceiver(receiver, intentFilter); // 注册本地接收器
manager.unregisterReceiver(receiver); // 注销本地接收器

manager.sendBroadcast(intent); // 发送广播