zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    PCB 铺铜 转载
    VC++ 学习笔记3 获取编辑框字符串
    VC++ 学习笔记2 列表框添加字符串
    VC++组合框——学习笔记1(组合框选项的添加和无法显示下拉选项)
    微信蓝牙ble记录
    最近遇到的问题与分析还有可能的结果
    注入与以往的开发思路
    abp的权限与导航菜单的关系
    ionic入坑记记录
    abp相关
  • 原文地址:https://www.cnblogs.com/xiaoxiaoboke/p/2088138.html
Copyright © 2011-2022 走看看