Broadcast组件

     BroadCast Receiver(广播接收器)相似于事件处理的机制,只不过这种事件是系统级别的广播事件。咱们既可使用Intent的sendBroadcast方法发送广播事件,也能够在程序中实现Broadcast Reciever来监听和响应这些广播事件包括系统自身产生的广播事件,例如收到短信,电池充满等。下面是本人在学习过程当中的概括和心得。android


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

 
 

      
      
               
      
      
  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的时候响应消息。系统中提供了另一种注册广播接收器的方法,能够随着应用程序的开启和关闭自动开始和结束响应。代码以下:this

 
 

      
      
               
      
      
  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接收消息与广播接收器接收消息机制的不一样。spa

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

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

     再次,对于前者接受的系统事件,须要由用户本身指定传递的类型(ACTION)。而后后者所接收的广播事件,不只能够接收自定义的广播事件,也能够由系统本身发出(BROADCAST),用户仅仅定义接受器便可;继承

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

相关文章
相关标签/搜索