zoukankan      html  css  js  c++  java
  • 代码中注册Broadcast

    a) BroadcastReceiver的注册方法
    在上节课当中,我们已经讨论过BroadcastReceiver的运行机制和基本使用方法,如果要使监听器能够接受到广播所发送Intent,就必须将这个BroadcastReceiver注册到系统当中,在manifest文件注册的方法如下:


    但是使用这样的方法进行注册之后,即使你的应用程序没有启动,或者已经被关闭,这个BroadcastReceiver依然会继续运行,这样的运行机制可能会给软件的用户造成困扰。所以作为程序的开发者,我们希望能够有一种灵活的机制完成BroadcastReceiver的绑定和解除绑定操作。Android当然也考虑到了这些问题,所以在Context这个类当中提供了如下两个函数:

    i. registerReceiver(receiver,filter);
    这个函数的作用就是将一个BroadcastReceiver注册到应用程序当中,这个函数接收两个参数,第一个参数是需要注册的BroadcastReceiver对象,第二个是一个IntentFilter。第一个参数是非常容易理解的,第二个参数的作用是定义了哪些Intent才能触发这个注册的BroadcastReceiver对象。类似于前面所讲解的
    <intent-filter>标签的作用;

    ii. unregisterReceiver(receiver);
    这个方法就非常的简单了,用于解除BroadcastReceiver的绑定状态。一旦解除完成,响应的BroadcastReceiver就不会再接收系统所广播的Intent了。

    b) 两种注册BroadcastReceiver方法的比较:
    现在我们了解了两种注册BroadcastReceiver的方法之后,需要考虑一下这两种方法适用的场合:

    i. 第一种注册的方法可以保证在应用程序安装之后,BroadcastReceiver始终处于活动状态,通常用于监听系统状态的改变,比如说手机的电量,wifi网卡的状态(当然,监视这些东西也是取决于软件的需求)。对于这样的BroadcastReceiver,通常是在产生某个特定的系统事件之后,进行相应的操作,比如说wifi网卡打开时,给用户一个提示;

    ii. 第二种注册方法相对第一种要灵活的多,这样注册的BroadcastReceiver通常用于更新UI的状态。一般来说,都是在一个Activity启动的时候使用这样的方法注册BroadcastReceiver,一旦接收到广播的事件,就可以在onReceive方法当中更新当前的这个Activity当中的控件。但是需要注意的是如果这个Activity不可见了,就应该调用unregisterReceiver方法来解除注册;

    Android系统当中自带的Broadcast Action
    我们使用BroadcastReceiver的目的多半是为了监听系统当中所发生的各种各样事件(当然也不排除有的时候我们自己的程序也会广播事件),所以就有必要了解一下在Android系统当中,究竟有哪些事件会被广播出来,关于这个问题Android SDK的文档上面有着详细的解释:


    除了以上的这些Actions之外,Anroid系统还会将一些应用程序级别的时间广播出来,例如收到短消息等等。

    演示一个简单的例子,在代码中注册广播,按下button发出广播,然后在onReceive方法中接受广播并打印收到广播的内容

    首先看TestBC2Activity.java文件,这里主要是两个按钮,一个是用于发送广播,一个是用于取消广播,具体代码如下:

     

    View Code
     1 import android.app.Activity;
    2 import android.content.IntentFilter;
    3 import android.os.Bundle;
    4 import android.view.View;
    5 import android.view.View.OnClickListener;
    6 import android.widget.Button;
    7
    8 public class TestBC2Activity extends Activity {
    9 /** Called when the activity is first created. */
    10 private Button registerButton = null;
    11 private Button unregisterButton = null;
    12 private SMSReceiver smsReceiver = null;
    13
    14 private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";
    15 @Override
    16 public void onCreate(Bundle savedInstanceState) {
    17 super.onCreate(savedInstanceState);
    18 setContentView(R.layout.main);
    19 registerButton = (Button)findViewById(R.id.register);
    20 registerButton.setOnClickListener(new RegisterReceiverListener());
    21 unregisterButton = (Button)findViewById(R.id.unregister);
    22 unregisterButton.setOnClickListener(new UnRegisterReceiverListener());
    23 }
    24
    25 class RegisterReceiverListener implements OnClickListener{
    26
    27 @Override
    28 public void onClick(View v) {
    29 //生成一个BroiadcastReceiver对象
    30 smsReceiver = new SMSReceiver();
    31 //生成一个IntentFilter对象
    32 IntentFilter filter = new IntentFilter();
    33 //为IntentFilter添加一个Action
    34 filter.addAction(SMS_ACTION);
    35 //将BroadcastReceiver对象注册到系统当中
    36 TestBC2Activity.this.registerReceiver(smsReceiver, filter);
    37 }
    38
    39 }
    40
    41 class UnRegisterReceiverListener implements OnClickListener{
    42
    43 @Override
    44 public void onClick(View v) {
    45 //解除BroadcastReceiver对象的注册
    46 TestBC2Activity.this.unregisterReceiver(smsReceiver);
    47 }
    48
    49 }
    50 }

    第二步用于接受广播

     

    View Code
     1 import android.content.BroadcastReceiver;
    2 import android.content.Context;
    3 import android.content.Intent;
    4 import android.os.Bundle;
    5 import android.telephony.SmsMessage;
    6
    7 public class SMSReceiver extends BroadcastReceiver{
    8
    9 @Override
    10 public void onReceive(Context context, Intent intent) {
    11 // TODO Auto-generated method stub
    12 System.out.println("receive message");
    13
    14 //接受Intent对象当中的数据
    15 Bundle bundle = intent.getExtras();
    16 //在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组
    17 Object[] myOBJpdus = (Object[]) bundle.get("pdus");
    18 //创建一个SmsMessage类型的数组
    19 SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
    20 System.out.println(messages.length);
    21 for (int i = 0; i<myOBJpdus.length; i++)
    22 {
    23 //使用Object数组当中的对象创建SmsMessage对象
    24 messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);
    25 //调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容
    26 System.out.println(messages[i].getDisplayMessageBody());
    27 }
    28 try {
    29 Thread.sleep(30 * 1000);
    30 System.out.println("-------------------------------");
    31 } catch (InterruptedException e) {
    32 // TODO Auto-generated catch block
    33 e.printStackTrace();
    34 }
    35 }
    36
    37 }

    效果图:

     



     

     

  • 相关阅读:
    远程访问Linux系统桌面
    NFS原理详解
    编译portmap和nfs-utils
    NFS资料
    PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理
    usb资料2
    USB相关资料
    书籍
    最详细的Log4j使用教程
    iOS开发UI篇—无限轮播(新闻数据展示)
  • 原文地址:https://www.cnblogs.com/shaoyangjiang/p/2383979.html
Copyright © 2011-2022 走看看