Android中的广播机制

来源:互联网 发布:2017软件评测师真题 编辑:程序博客网 时间:2024/05/08 15:49

 一.简介

       日常生活中,广播机制很常见。最普遍的例子就是收音机了。下面来分析一下收音机的整个机制:收音机里的电台播放内容,不过它只负责播放内容,并不关心关于广播的接收,处理等工作。而我们则调到我们感兴趣的电台进行收听。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:日期改变。

此外还有很多,具体可查帮助文档。