Android四大组件--Broadcast Receiver

来源:互联网 发布:贵金属交易软件手续费 编辑:程序博客网 时间:2024/06/05 15:34

Android四大组件--Broadcast Receiver

一、BroadcastReceiver:广播接收器

1.广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。

2.应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。

3.广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。

二、BroadcastReceiver事件分类

1.系统广播事件

2.用户自定义的广播事件

三、BroadcastReceiver事件的编程流程

1.注册广播事件:注册方式有两种

1)静态注册,就是在 AndroidManifest.xml文件中定义.这种方法有一个特点即使你的应用程序已经关闭了,但这个BroadcastReceiver依然会接受广播出来的对象,也就是说无论你这个应用程序时开还是关都属于活动状态都可以接受到广播的事件;

2)动态注册,是在程序中使用Context.registerReceiver注册。一般在onStart中注册,onStop中取消unregisterReceiver.如果不执行unregisterReceiver();方法取消注册,跟静态是一样的。但是如果执行该方法,当执行过以后,就不能接受广播了。

2.发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action

3.接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则Android会弹出超时dialog

四、两类BroadcastReceiver

1.正常广播 Normalbroadcasts(用 Context.sendBroadcast()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。

2.有序广播 Orderedbroadcasts(用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver

五、普通广播和有序广播

如果有多个接收者都注册了相同的广播地址,又会是什么情况呢,能同时接收到同一条广播吗,相互之间会不会有干扰呢?这就涉及到普通广播和有序广播的概念了。

1.Normal Broadcast(普通广播):NormalBroadcast是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高。但缺点是接受者不能将处理结果传递给下一个接收者,并且无法终止Broadcast Intent的广播。

2. Ordered Broadcast(有序广播):Ordered Broadcast的接收者将按预先声明的优先级依次接受Broadcast。如:A的级别高于BB的级别高于C,那么Broadcast先传给A,再传给B,最后传给C。优先级别声明在元素的android:priority属性中,数越大优先级别越高,取值范围为-1000-1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置。OrderedBroadcast接收者可以终止Broadcast Intent的传播,BroadcastIntent的传播一旦终止,后面的接收者就无法接收到Broadcast另外,OrderedBroadcast的接收者可以将数据传递给下一个接收者。如:A得到Broadcast后,可以往它的结果对象中存入数据,当Broadcast传给B时,B可以从A的结果对象中得到A存入的数据。

3. context提供的如下两个方法用于发送广播:
1)sendBroadcast():发送NormalBroadcast
2)sendOrderedBroadcast
():发送OrderedBroadcast。

4.对于OrderedBroadcast而言,系统会根据接收者生命的优先级别顺序逐个执行接收者,优先接收到Broadcast的接收者可以终止Broadcast,调用BroadcastReceiverabortBroadcast()方法即可终止Broadcast。如果Broadcast被前面的接收者终止,后面的接收者就再也无法获取到Broadcast

5.
不仅如此,对于OrderBroadcast而言,优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,然后传给下一个接收者,下一个接收者通过代码: Bundle bundle=getResultExtras(true)可以获取上一个接收者存入的数据。


0 0
原创粉丝点击