文章

Android基础——广播

开始

广播机制在程序之间的交互中使用,每个程序都可以发送和接收广播,在程序内也可通过广播实现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);  // 发送广播
本文由作者按照 CC BY 4.0 进行授权