本文参考了https://blog.csdn.net/qq_35578940/article/details/52445170
BroadCastReceiver是Android四大组件之一,主要用于接收系统或者app发送的广播事件
广播分两种: 有序广播和无序广播
内部通信实现机制:通过Android系统的Binder机制实现通信的
无序广播:sendBroadcast()方法发送的广播为无序广播,无序广播逻辑上可以被任何广播接受者接收到,优点是效率高。缺点是一个接收者不能将处理结果传递给下一个接收者,传递的数据在传输过程中不能被修改,并无法终止广播的传播。
有序广播:sendOrderedBroadcast()方法发送的广播为有序广播,有序广播依次传播,列如有三个广播接收者A,B,C, 优先级是A>B>C,
此时发送一条广播,那这个消息先传给A,再传给B, 最后传给C,每个接收者都有权终止广播,比如B终止广播,C就无法接受到,
此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中获取A存入的数据。
在通过context.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,initialCode, initialData, initialExtras);时我们可以指定resultReceiver广播接收者,
这个接收者我们可以认为是最终接收者,通常情况下如果比他优先级更高的接收者如果没有终止广播,那么他的onReceive方法会被执行两次,
第一次是正常的按照优先级顺序执行,第二次是作为最终接收者接收,如果比他优先级高的接收者终止了广播,那么他依然能接收到广播。
在我们的项目中经常使用广播接收者接收系统通知,比如开机启动,sd卡挂载,低电量,外拨电话,锁屏等等,
如果我们做的是播放器,那么监听到用户锁屏后我们应该将我们的播放器暂停等。
BroadcastReceiver有两种注册方法,在Androidmainfest中注册广播接收者称为静态注册,在代码中注册称为动态注册。
静态注册的广播接收者只要app在系统中注册则可以一直接收到广播消息,动态注册的广播接收者当注册的activity或Service销毁了那么就接收不到广播了,
所以一般应用都是静态注册的,有一些操作特别频繁的广播事件在Androidmainfest中注册无效的,
如手机锁屏广播,在代码中我们可以用registerReceiver()方法去注册广播。
需要注意的地方:
1.BroadcastReceiver的生命周期是非常短暂的,在接收广播的时候创建,onReceiver()方法结束之后销毁
2. 广播接收者中不要做一些耗时的工作,否则会弹出Application No Response(应用无响应anr)错误对话框,,一般耗时的较长的操作最好放在服务中完成。
3.最好也不要在广播接收者中创建子线程做耗时操作,因为广播接收者被销毁后进程就成为空进程,而空进程很容易被系统杀掉。
Android中引入广播机制的用意 :
1.程序间互通消息(例如在自己的应用程序内监听系统的来电)
2.效率上(参考UDP的广播协议在局域网的方便性)
3.设计模式上(反转控制的一种应用,类似监听者模式)
发送和接收广播的小Demo;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//点击按钮发送一条无序 广播
public void click(View v) {
Intent intent =new Intent();
//设置发送广播的事件
intent.setAction("com.itcast.customreceiver");
intent.putExtra("name", "每天晚上7点准时开整~~");
//发送广播
sendBroadcast(intent);
}
}
BroadcastReceiver {
//这个方法接收我们自定义发送的广播
@Override
public void onReceive(Context context, Intent intent) {
//终止广播
abortBroadcast();
String name = intent.getStringExtra("name");
Toast.makeText(context, name,0).show();
}
}