一.简介
日常生活中,广播机制很常见。最普遍的例子就是收音机了。下面来分析一下收音机的整个机制:收音机里的电台播放内容,不过它只负责播放内容,并不关心关于广播的接收,处理等工作。而我们则调到我们感兴趣的电台进行收听。Android中的广播机制也是如此,发送方只负责发送数据,关于数据的接收,处理都由接收方决定,与发送方无关。Android中广播的是各种OS发生的事件,比如接收短信,电量低等等,而具体的处理是有广播接收器来执行。广播机制是很有用的,比如对照片的大头贴处理,对来电的黑名单处理等都用到了广播。
二.广播流程
1.由程序员开发BroadcastReceiver,即广播接收器。这个类决定了接收的事件怎么处理。
2.在Manifest.xml里注册BroadcastReceiver。
3.当Android系统发生事件,则会给所有的BroadcastReceiver广播该事件。
4.BroadcastReceiver做判断(匹配action),若匹配,则触发相应的动作。
三.代码示例
1.编写BroadcastReceiver
public class MyReceiver extends BroadcastReceiver{ //MyReceiver类继承了BroadcastReceiver
public MyReceiver() { //构造函数
System.out.println("MyReceiver");
}
@Override
public void onReceive(Context context, Intent intent) { //onReceive方法就是定义了接收广播后执行的操作
// TODO Auto-generated method stub
System.out.println("onReceive");
}
}
2.注册
关于BroadcastReceiver的注册有两种方法:在xml里直接注册和在程序代码中注册。
(1)在Manifest.xml中直接注册。
<receiver android:name="com.share.SMSReceiver"> //用receiver 标签来注册广播接收器,name即名字。
<intent-filter> //过滤器
<action android:name="android.provider.Telephony.SMS_RECEIVED"/> //通过定义action,决定了该接收器接受哪种事件的广播。
//当广播到来时进行过滤,通过匹配action,
//若一致,则触发。
//关于action的值,系统提供许多常量来对应相应的事件,
//在之后作介绍。这里的action对应的是接收短信。
</intent-filter>
</receiver>
这种方法的特点是即使关闭了应用程序,接收仍然在继续。缺点是在某些情况下会造成浪费,比如更新UI的操作,Activity未启动的时候进行更新是没有必要的,会造成电池电量,CPU等的浪费。
(2)在代码中注册
注册:
MyReceiver myReceiver=new MyReceiver(); //创建MyReceiver接收器的对象
IntentFilter filter=new IntentFilter(); //IntentFilter对象,其实就对应了第一种方法里的 <intent-filter>。
filter.addAction(SMS_ACTION); //给IntentFilter 添加相应的action,表明该receiver过滤的事件。
BroadcastActivity.this.registerReceiver(myReceiver, filter); //注册。将receiver和filter作为参数传进去进行注册。
注销:
BroadcastActivity.this.unregisterReceiver(myReceiver); //参数即要注销的接收器对象。
这种方法的特点是只有程序开启的时候才接收,非常适合用于UI更新等操作。
3.广播
广播有可能是系统发生的事件,比如来短信,来电,电量低等事件,也可以由程序触发广播事件。
Intent intent=new Intent (); //新建Intent 对象
intent.setAction(Intent.ACTION_EDIT); //设置Intent的action,这个action的值就用来和接收器的filter中action的值做匹配。
BroadcastActivity.this.sendBroadcast(intent); //将intent事件广播。
四.几点说明
1.Receiver对象的生命周期
一旦onReceive返回,则结束该对象,所以每次接收广播,都会新生成一个Receiver对象。
2.Intent
广播机制中的Intent与负责传输的Intent是不一样的。特点是它将动作(action)与数据(data)分开了。就好比洗衣服这件事。动作是“洗”,数据是“衣服”,你当然可以改变数据,将“衣服”变成“脸”。
3.Android内置的Broadcast Actions
例:
ACTION_BARRERY_LOW:电量低。
ACTION_SCREEN_ON:屏幕被打开。
ACTION_DATE_CHANGED:日期改变。
此外还有很多,具体可查帮助文档。