广播的应用场景:
- 同一app内部的同一组件内的消息通信(单个或多个线程之间)
- 同一app内部的不同组件之间的消息通信
- 同一app具有多个线程的不同组件之间的消息通信
- 不同app之间的组建之间消息通信
- Android系统在特定情况下与App之间的消息通信
广播分为两种:
- 有序广播
- 类似于击鼓传花的游戏,游戏开始时发送广播,每个游戏者就是广播接收器,依次向下传递,只能由前一个游戏者传递给下一个游戏者。若某一个游戏者的花掉了,这就是广播截断,广播就不能继续传下去
- 无序广播
- 类似于老师宣布下课,学生就是广播接收者,基本都是按照同一时间执行某些操作
广播的使用,需要继承BroadcastReceiver并实现抽象方法
1 | public class MyBroadcast extends BroadcastReceiver{ |
当BroadcastReceiver作为Android的四大组件之一,在使用时,必须对BroadcastReceiver进行注册
注册方式分为两种:
静态注册
- 类似于Activity,自定义广播接收器之后,在AndroidManifest.xml中注册即为静态注册
1
2
3
4
5<receiver android:name=".MyBroadcast">
<intent-filter>
<action android:name="io.innofang.broadcastdemo.MYBROADCAST"/>
</intent-filter>
</reveiver>其中action类似于显示广播的频段,当广播发送的时候需要指定后面的字符串。接收器接收的时候,也会根据该处指定的字符串进行过滤
动态注册
- 动态注册,即在java代码中进行注册,也就是程序启动后,执行到注册的代码才会注册成功,并且动态注册的广播需要接触注册
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23public class MainActivity extends AppCompatActivity {
private static final String MY_ACTION = "io.innofang.broadcastdemo.MYBROADCAST";
private MyBroadcast mMyBroadcast;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Intent intent = new Intent(MY_ACTION);
// 初始化广播接收器
mMyCast = new MyBroadcast();
// 初始化过滤器,对应Manifest文件中的receiver的字段
IntentFilter filter = new IntentFilter();
// 在过滤器中添加action
filter.addAction(MY_ACTION);
// 注册广播接收器
registerReceiver(mMyCast, filter);
}
protected void onDestroy(){
super.onDestroy();
// 在onDestroy中取消注册
unregisterReceiver(mMyCast);
}
}
- 动态注册,即在java代码中进行注册,也就是程序启动后,执行到注册的代码才会注册成功,并且动态注册的广播需要接触注册
区别:
- 动态注册的广播接收者要优先于静态注册的广播接收者
- 当程序被销毁掉之后,静态注册的广播接收者任然可以接受到广播,但是动态注册的广播接收者则不可以