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.xml
中application
标签中的receiver
标签中注册
receiver
标签
name
:指定自定义广播接收器类exported
:是否允许该Receiver接收本程序以外的广播enabled
:是否启用该Receiverintent-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); // 发送广播