基础知识:三、 Broadcast Receiver

来源:互联网 发布:小企业做账软件 编辑:程序博客网 时间:2024/06/05 11:41

三、 Broadcast Receiver


1、请描述一下BroadcastReceiver
BroadCastReceiver是Android四大组件之一,主要用于接收系统或者app发送的广播事件。 广播分两种:有序广播和无序广播。 内部通信实现机制:通过Android系统的Binder机制实现通信。 无序广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不 能将处理结果传递给下一个接收者,并无法终止广播intent的传播。 有序广播:按照被接收者的优先级顺序,在被接收者中依次传播。比如有三个广播接收者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挂载、低电量、外播电话、 锁屏等。 如果我们做的是播放器,那么监听到用户锁屏后我们应该将我们的播放之暂停等。


2、在manifest和代码中如何注册和使用BroadcastReceiver

在清单文件中注册广播接收者称为静态注册,在代码中注册称为动态注册。静态注册的广播接收者只要app在系统中运行则一直可以接收到广播消息,动态注册的广播接收者当注册的 Activity或者Service销毁了那么就接收不到广播了。

静态注册:在清单文件中进行如下配置
<receiver android:name=".BroadcastReceiver1" > <intent-filter> <action android:name="android.intent.action.CALL" > </action> </intent-filter> </receiver>
动态注册:在代码中进行如下注册
receiver = new BroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(CALL_ACTION); context.registerReceiver(receiver, intentFilter);


3、BroadCastReceiver的生命周期

a. 广播接收者的生命周期非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁;
b. 广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框;
c. 最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉;
d. 耗时的较长的工作最好放在服务中完成;


4、Android引入广播机制的用意 

a. 从MVC的角度考虑(应用程序内) 其实回答这个问题的时候还可以这样问,android为什么要有 那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点 嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组 件的信息和数据交互。 

b. 程序间互通消息(例如在自己的应用程序内监听系统来电)

 c. 效率上(参考UDP的广播协议在局域网的方便性) 

d. 设计模式上(反转控制的一种应用,类似监听者模式)

0 0
原创粉丝点击