广播接收者入门

什么是广播接收者

在Android系统中内置了很多系统级别的广播,例如:手机开机广播,电池电量不足广播等等。为了监听这些广播事件,Android中提供了一个BroadcastReceiver组件,该组件可以监听来自系统或应用程序的广播。当Android系统产生一个广播事件时,可以有一个或多个BroadcastReceiver接收并进行处理。


广播接收者创建与注册

广播接收者开发步骤:

1——创建一个普通类继承BroadcastReceiver,并重写onReceive()方法

2——因为BroadcastReceiver是Android四大组件之一,所以得在Android清单文件中注册

注册广播接收者有二种方式:常驻型广播和非常驻型广播

1——常驻型广播,即用XML声明

当应用程序关闭后,如果接收到其它应用程序发出的广播,那么该程序自动重新启动

<receiver android:name=”cn.itcast.MyBroadcastReceiver”>

<intent-filter android:priority=”1000”>值越大,优先级越高

<action android:name=”android.provider.Telphony.SMS_RECEIVER”/>短信接收广播

</intent-filter>

</receiver>

2——非常驻型广播,即用Java声明(今天最后再讲--电量显示)

依赖于注册广播的组件的生命周期。例如:在Activity中注册广播接收者,当Activity销毁

后广播接收者也随之删除

Activity:onCreate()方法:

MyBroadcastReceiver receiver = new MyBroadcastReceiver();

String action=” android.provider.Telphony.SMS_RECEIVER”;

IntentFilter intentFilter = new IntentFilter(action);

registerReceiver(receiver,intentFilter);

与常驻型广播广播不同,代码有注册广播,也有删除广播。例如:在Activity的onCreate()中

注册广播,就要在onDestroy()中移除广播。

Activity:onDestroy()方法:

unregisterReceiver(receiver);

 

注意:广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁。常驻型广播在应用程序关闭后,接收到广播会重新自动创建。非常驻型广播则依赖与注册广播组件的生命周期和调用unregisterReceiver()方法手动移除。

自定义广播

自定义广播的发送与接收

Android系统中自带了很多广播,如果需要监听某个广播,只需要创建对应的广播接收者。当这些系统级别的广播不能满足实际需求时,还可以自定义广播。

需要注意的是,自定义广播需要由对应的广播接收者去接收,否则这个广播是无意义的。

广播的类型

有序广播与无序广播

在Android系统中,根据广播的执行顺序不同,可将其分为:无序广播和有序广播。

1——无序广播

是一种完全异步执行的广播,在广播发出去之后,所有监听了这个广播的接收者几乎在同一

时刻收到广播,效率高,但无法截断

2——有序广播

是一种同步执行的广播,在广播发出去之后,同一时刻只会有一个广播接收者能够接收到这条个广播,当这个广播接收者中的onReceive()执行完毕后,广播才会继续传递,这种方式效率低,但可以截断。

 有序广播发送一条消息后,高优先级的广播接收者先接收到广播,它可以截断广播,这样该广

播就不会继续传递给低优先级的广播接收者了,通过调用abortBroadcast()方法来实现。

 优先级就是在android清单文件中通过android:priority=””参数配置的,范围是-1000到1000,默

认为0。如果二个广播接收者优先级相同,则先注册的广播接收者优先接收到广播。如果二个Android应用程序都监听了同一个广播,则先安装的Android应用优先接收到广播。

在实际开发中,还可能遇到这种情况,当发出了一个有序广播,然后定义多个广播接收者来接收这个广播。如果其中一个高优先级的广播接收者截断了该广播,我也希望低优先级的广播接收者也能接收到该广播,怎么办呢?代码片段:

Intent intent = new Intent();

Intent.action(“www.tlw.cn”);

MyBroadcastReceiver receiver03 = new MyBroadcastReceiver();低优先级的广播接收者

sendOrderedBroadcast(intent,null,receiver03,null,0,null,null);强行将广播发送指定的接收者

常用广播接收者

开机启动界面

常驻型广播接收者,在android清单文件中注册

注意,Android3.0以后,出现了一个安全机制,如果用户以前没启动过这个开机程序进程,

就算注册了开机启动的广播也无法接收到开机启动的广播事件,所以我们得先人工启动自定义的开机程序进程,再关机。

电量显示

非常驻型广播接收者,在Activity中Java代码注册

短信拦截器广播