7.1 . 理论概述
- 广播事件处理属于系统级的事件处理(一般事件处理是属于View级的事件处理)
-
一个应用可以在发生特定事件时发送Broadcast, 系统中任何应用只要注册了对应的Receiver就会接收到此Broadcast
-
一个应用如果对某个广播感兴趣, 就可以注册对应的Receiver来接收广播
- 广播事件机制是应用程序(进程间)之间通信的一种手段
- 广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这种形式来达到接、收双方的完全解耦
- 广播事件处理过程即针对某一广播做出响应的过程
7.2 广播接收这创建与注册
image image image7.2.1 创建广播接收者
要对监听到的广播事件进行处理,需要创建一个类继承自BroadcastReceiver,然后重写onReceive()方法,具体代码示例如下:
public class MyBroadcastReceiver extends BroadcastReceiver
{
@override
public void onReceive(Context context,Intent intent)
{
`
}
}
当监听到有广播发出时,就会调用onReceive()方法,在onReceive()中进行对事件的处理即可。
7.2.2 注册常驻型广播
常驻型广播是当应用程序关闭后,如果接收到其他应用程序发出的广播,那么该程序会自动重新启动。常驻型广播需要在清单文件中注册,具体代码如下所示:
<receiver android:name="cn.itcast.MyBroadcastReceiver">
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.SMS_RECEIVED">
</intent-filter>
</receiver>
android:name="cn.itcast.xxx"是创建的广播接收者的全路径名,与定义隐式意图一样,广播接收者也需要注册一个<intent-filter>,在过滤器中指定要接收的广播事件,"android.provider.Telephony.SMS_RECEIVED"是系统内部定义的短信接收的广播事件;android:priority="20"是该广播的优先级,这个值越大代表接收的优先级越高。
7.2.3 注册非常驻型广播
非常驻型广播依赖于注册广播的组件的生命周期,例如,在Activity中注册广播接收者,当Activity销毁后广播也随之被移除。这种广播事件在代码中注册,具体代码示例如下:
MyBroadCastReceiver receiver=new MyBroadCastReceiver();
//实例化过滤器并设置要过滤的广播
String action="android.provider.Telephony.SMS_RECEIVED";
IntentFilter intentFilter=new IntentFilter(action);
//注册广播
registerReceiver(receiver,intentFiler);
与清单文件注册一样,代码注册广播同样需要进行过滤,IntentFilter接收的是监听广播事件。最后用
egisterReceiver方法进行注册。
与清单文件不同的是,代码有注册也有移除,比如下Activity的onCreate()中注册广播,就要在onDestory()中进行解除广播,如下代码所示:
unregisterReceiver(receiver);
需要注意的是,广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束后销毁。常驻型广播在应用程序关闭后,接收到广播会重新自动创建。非常驻型广播则依赖与注册广播组件的生命周期和调用unregisterReceiver()方法手动移除。
7.3 自定义广播
自定义广播需要由对应的广播接收器区接收,否则这个广播无意义。当自定义广播发送一条消息时,这个广播消息会一直存在一个公共区域中,当有广播接收者监听这个消息区域的时候,就会及时地收到广播消息。因此可以通过这种自定义广播来处理程序中的特殊功能。
7.4 有序广播和无序广播
7.4.1 无序广播
无序广播是一种完全异步执行的广播,在广播发出去之后,所有监听了这个广播事件的广播接收器几乎都在痛一时刻接收到这条广播,它们之间没有任何先后顺序可言,这种广播的效率会比较高,但同时意味着它是无法被截断的。
7.4.2 有序广播
有序广播是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到消息,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递,此时的广播接收器有先后顺序,并且可以被拦截。
有序广播发送一条消息后,高优先级的广播接收器收到广播,低优先级接收器后接收到广播。如果高优先级的广播接收器将广播终止,则后面的广播接收器无法接收到广播。想要拦截一条广播不往下发送,可以使用abortBroadcast();方法。
优先级的范围为-1000~1000之间。如果两个广播接收者的优先级相同,则先注册的组件先接收到广播。如果两个应用程序监听了同一个广播事件并设置了优先级,则先安装的应用优先级接收到广播。
7.4.3 指定广播
当发出了一个有序广播,然后定义多个接收者接收这条广播。这些广播接收者的优先级有高有低,需要其中一个广播接收者无论如何都要接收到广播事件,哪怕它的优先级是最低的或者或者被广播优先级高的接收者强行终结。这时候需要用到sendOrderedBraodcast()方法发送有序广播,如下代码:
Intent intent=new Intent();
//定义广播的事件类型
intent.setAction("www.itcast.cn");
//发送有序广播
MyBroadcastReceiver receiver=new MyBroadcastReceiver();
sendOrderBroadcast(intent,null,receiver,null,0,null,null);//第三个参数为指定的广播接收者。
网友评论