Broadcast组件

  允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://52android.blog.51cto.com/2554429/500534
  BroadCast Receiver(广播接收器)类似于事件处理的机制,只不过这种事件是系统级别的广播事件。我们既可以使用Intent的sendBroadcast方法发送广播事件,也可以在程序中实现Broadcast Reciever来监听和响应这些广播事件包括系统自身产生的广播事件,例如收到短信,电池充满等。下面是本人在学习过程中的归纳和心得。


1. 发送广播事件
    发送广播事件可以通过Intent的sendBroadcast方法,定义Intent对象的Action。一旦系统中广播接收器定义的过滤器中允许接受该广播,就可对所受到的广播进行响应。代码如下:

 
 

  1. // 实例化Intent对象  
  2.                 Intent intent = new Intent();  
  3.                 // 设置Intent action属性,Action属性需要和接收器中允许的属性一致  
  4.                 intent.setAction(MY_ACTION);  
  5.                 // 发出广播  
  6.                 sendBroadcast(intent);  


2. 接受广播消息
    通过继承于BroadcastReceiver的子类接受广播消息。首先需要在AndroidManifest.xml文件中加入receive标签,并加入Intent过滤器,声明可以接收的Intent。如下:

 
 

  1. <receiver android:name=".MyReciever"> 
  2.            <intent-filter> 
  3.                <action android:name="ACTION"/> 
  4.            </intent-filter> 
  5.         </receiver> 


    对广播消息的响应是通过复写onRecieve()方法体来实现。在该方法中,处理的是系统广播事件接收短信,在方法中,将短信读取,并在提示消息中显示出来。具体实现方法如下:

 

  1. public class SMSReceiver extends BroadcastReceiver 
  2.     /*当收到短信时,就会触发此方法*/ 
  3.     public void onReceive(Context context, Intent intent) 
  4.     { 
  5.         Bundle bundle = intent.getExtras(); 
  6.         Object messages[] = (Object[]) bundle.get("pdus"); 
  7.         SmsMessage smsMessage[] = new SmsMessage[messages.length]; 
  8.         for (int n = 0; n < messages.length; n++) 
  9.         { 
  10.             smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
  11.         } 
  12.         //产生一个Toast 
  13.         Toast toast = Toast.makeText(context, "短信内容: " + smsMessage[0].getMessageBody(), Toast.LENGTH_LONG); 
  14.         //设置toast显示的位置 
  15.         //toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 200); 
  16.         //显示该Toast 
  17.         toast.show(); 
  18.     } 

    广播接收器既可以用于接收自定义的广播消息,也可以接收系统内部的广播事件。通过修改AndroidManifest.xml中接收器标签中的过滤器来实现。如果想要对系统接收到短信这个广播事件进行响应,则需要进行如下配置:

 
 

  1. <receiver android:name=".MyReciever">  
  2.            <intent-filter>  
  3.                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
  4.            </intent-filter>  
  5.         </receiver> 
  6. //记得加上接收短信的权限
  7. <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

3. 需要注意的问题

    a. 一旦广播接收器能够响应的事件出现,它就会被触发而不管这个应用程序有没有被启动。但是对于一些需要对UI进行操作的响应来说,这种机制是不合适的,不需要在没有UI的时候响应消息。系统中提供了另外一种注册广播接收器的方法,可以随着应用程序的开启和关闭自动开始和结束响应。代码如下:

 
 

  1. //生成一个BroiadcastReceiver对象  
  2.             smsReceiver = new SMSReceiver();  
  3.             //生成一个IntentFilter对象  
  4.             IntentFilter filter = new IntentFilter();  
  5.             //为IntentFilter添加一个Action  
  6.             filter.addAction(SMS_ACTION);  
  7.             //将BroadcastReceiver对象注册到系统当中  
  8.             TestBC2Activity.this.registerReceiver(smsReceiver, filter);  
  9.  
  10.  
  11. //解除BroadcastReceiver对象的注册
       TestBC2Activity.this.unregisterReceiver(smsReceiver);
  12.  

  b. 需要区分Activity和Service接收消息与广播接收器接收消息机制的不同。

    首先,前者接受消息的机制,既可以通过显式的指明组件名称传递,也可以通过设置接受组件的过滤器来隐式的传递。后者只能通过设置过滤器的方法来接收事件;

    其次,startActivity()(startService())对应一个Activity或者Service,可以开启一个活动或者服务。sendBroadcast()对应onRecieve(),它只能用于接收广播事件;

     再次,对于前者接受的系统事件,需要由用户自己指定传递的类型(ACTION)。然后后者所接收的广播事件,不仅可以接收自定义的广播事件,也可以由系统自己发出(BROADCAST),用户仅仅定义接受器即可;

    另外,前者在应用程序启动状态才接受消息;而后者只要接收到广播信息,就可以做出相应(在代码中注册接收器除外)。

本文出自 “我的Android开发志” 博客,请务必保留此出处http://52android.blog.51cto.com/2554429/500534

posted on 2011-06-23 15:06  小小博客小小员  阅读(320)  评论(0编辑  收藏  举报

导航