【Android】学习笔记(14)――BroadcastReceiver组件使用

Broadcast Receiver
作为Android四大组件之一的BroadcastReceiver,其作用可见一斑。下面就BroadcastReceiver的使用写一下我的学习总结。
从字面很好理解,它是广播接收器的意思,当某一指定类型的事件触发后,拥有该指定类型相对应的广播接收器均可以接收到这个事件,从而触发后续的操作。
实现这种广播接收机制就必须注册BroadcastReceiver,注册BroadcastReceiver有两种方式:
一.在AndroidManifest.xml配置文件中进行注册
首先要创建一个BroadcastReceiver的子类,子类中重写onReceive方法,这个方法内部就是当这个Receiver接收到特定的消息或事件时,需要做出的反应。
那么如何定义这些特定的消息或事件呢,我们可以在AndroidManifest.xml中注册,先看一个例子:
这是一个继承了BroadcastReceiver的子类:

 
 
  1. publicclass AReceiver extends BroadcastReceiver {

  2. public AReceiver() {

  3. // TODO Auto-generated constructor stub

  4. System.out.println("AReceive---->Constructor");

  5. }

  6. @Override

  7. publicvoid onReceive(Context arg0, Intent arg1) {

  8. // TODO Auto-generated method stub

  9. System.out.println("The TimeZone Changed");

  10. }

  11. }

接下来看如何在AndroidManifest.xml中注册:
 
 
  1. <receiverandroid:name=".AReceiver">

  2. <intent-filter>

  3. <actionandroid:name="android.intent.action.TIMEZONE_CHANGED"></action>

  4. </intent-filter>

  5. </receiver>

注册需要一个receiver标签,它有android:name属性,该属性提供的就是我们上面创建的BroadcastReceiver的子类。它的内部是intent-filter,是intent过滤器,只有符合该过滤器,才能执行相应的操作,否则就没反应。我这里加的 android.intent.action.TIMEZONE_CHANGED,这个参数可以再帮助文档里的Intent下面的常量中查到,如下图,其中标出的都是BroadcastReceiver可以作为过滤器的Action,文档中都是用Broadcast Action标出了。

140514146.png

除了在帮助文档中的一些Constants,其实还有一些Android隐藏的属性,比如android.provider.Telephony.SMS_RECEIVED,它是用来监听接收短消息的,当设置此类过滤器时,需要在AndroidManifest.xml中设置uses-permission,若如果要设置android.provider.Telephony.SMS_RECEIVED过滤器,则在AdroidManifest.xml中设置:
 
 
  1. <uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>


我上面代码中设置的是 android.intent.action.TIMEZONE_CHANGED,即,只要我改变时区信息,就会执行AReceiver中的onReceive方法,我在方法中的构造函数和onReceive方法中分别打印了语句,但改变时区信息后,构造函数和onReceive方法中的打印语句都会执行。
二.在Java代码中注册
首先和上一种方法一样,创建一个BroadcastReceiver的子类,代码和上一个例子一样(略)。
上一个代码接下来的工作是在AndroidManifest.xml中注册和添加过滤器,我们现在要做的工作本质上是一样的。下面代码说明问题:
 
 
  1. publicclass BroadcastDemo2Activity extends Activity {

  2. //有两个按钮,分别是注册广播接收器和注销广播接收器

  3. private Button button_register = null;

  4. private Button button_unregister = null;

  5. private AReceiver aReceiver = null;

  6. /** Called when the activity is first created. */

  7. @Override

  8. publicvoid onCreate(Bundle savedInstanceState) {

  9. super.onCreate(savedInstanceState);

  10. setContentView(R.layout.main);

  11. button_register = (Button)findViewById(R.id.register);

  12. button_unregister = (Button)findViewById(R.id.unregister);

  13. button_register.setOnClickListener(new OnClickListener() {

  14. @Override

  15. publicvoid onClick(View arg0) {

  16. // TODO Auto-generated method stub

  17. aReceiver = new AReceiver(); //创建一个BroadcastReceiver的子类的对象,然后我们就要对他进行设置了

  18. IntentFilter intentFilter = new IntentFilter();//创建一个IntentFilter的对象,这就和上个例子中的intent-filter标签一样,我们要往里面添加过滤器

  19. intentFilter.addAction("android.intent.action.TIMEZONE_CHANGED");//同样,我们添加和上一个例子一样的intent action,用来接收当时区改变的消息

  20. BroadcastDemo2Activity.this.registerReceiver(aReceiver, intentFilter);//添加完过滤器后,就要将BroadcastReceiver对象和相应的过滤器注册在Activity上

  21. }

  22. });

  23. button_unregister.setOnClickListener(new OnClickListener() {

  24. @Override

  25. publicvoid onClick(View arg0) {

  26. // TODO Auto-generated method stub

  27. BroadcastDemo2Activity.this.unregisterReceiver(aReceiver);//注销BroadcastReceiver的注册

  28. }

  29. });

  30. }

  31. }

当点击注册按钮后,去改变时区信息时,就会在Logcat中输出我们在AReceiver中的打印语句,当注销按钮被按下后,再去改变时区信息,就没有反应了,这就实现了用户自己控制BroadcastReceiver。
这两种方式都可以注册BroadcastReceiver,但各有优缺点,第一种相对比较简单易用,但是不易控制,因为在AndroidManifest.xml中定义之后,就不能再去更改了,也就是说,当你安装完这个应用,这个BroadcastReceiver就一直在那儿等待着召唤,用户自己也不能阻止,除非把应用卸载了,这是比较耗资源和麻烦的。而第二种虽然在注册时相比第一种复杂些(其实不怎么复杂),但带来的好处是,用户可以自己控制开关广播接收器,可控是一个比较大的优势。

附件为两个例子的参考代码,仅供参考。

如果我的文章给与了你帮助,就不妨请我喝杯咖啡吧,点击->btn-index.png

你可能感兴趣的:(android,移动开发,休闲)