代码中注册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 }

效果图:

 



 

 

posted on 2012-03-07 18:10  forrest001  阅读(1269)  评论(0编辑  收藏  举报

导航