Broadcase Receiver 广播接收器详解

Android中Broadcast Receiver组件详解

BroadcastReceiver(广播接收器)是Android中的四大组件之一。

下面是Android Doc中关于BroadcastReceiver的概述:
①广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。
②应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。
③广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

Android中的广播事件有两种,一种就是系统广播事件,比如:ACTION_BOOT_COMPLETED(系统启动完成后触发),ACTION_TIME_CHANGED(系统时间改变时触发),ACTION_BATTERY_LOW(电量低时触发)等等。另外一种是我们自定义的广播事件。

广播事件的流程
①注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIlter。
②发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。
③接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则Android会弹出超时dialog。

下面我通过代码演示自定义广播事件和系统广播事件的使用。完整代码下载地址:android_broadcastreceiver.rar

Step1:在MainActivity的onStart方法中注册广播事件。静态注册方式是在AndroidManifest.xml文件中。

Step2: 点击相应按钮后会触发相应的方式来发送广播消息。

[java] view plaincopy

  1. /**
  2. * MainActivity
  3. * @author zuolongsnail
  4. *
  5. */
  6. public class MainActivity extends Activity {
  7. private Button sendStaticBtn;
  8. private Button sendDynamicBtn;
  9. private Button sendSystemBtn;
  10. private static final String STATICACTION = "com.byread.static";
  11. private static final String DYNAMICACTION = "com.byread.dynamic";
  12. // USB设备连接
  13. private static final String SYSTEMACTION = Intent.ACTION_POWER_CONNECTED;
  14. @Override
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. sendStaticBtn = (Button) findViewById(R.id.send_static);
  19. sendDynamicBtn = (Button) findViewById(R.id.send_dynamic);
  20. sendSystemBtn = (Button) findViewById(R.id.send_system);
  21. sendStaticBtn.setOnClickListener(new MyOnClickListener());
  22. sendDynamicBtn.setOnClickListener(new MyOnClickListener());
  23. sendSystemBtn.setOnClickListener(new MyOnClickListener());
  24. }
  25. class MyOnClickListener implements OnClickListener{
  26. @Override
  27. public void onClick(View v) {
  28. // 发送自定义静态注册广播消息
  29. if(v.getId() == R.id.send_static){
  30. Log.e("MainActivity", "发送自定义静态注册广播消息");
  31. Intent intent = new Intent();
  32. intent.setAction(STATICACTION);
  33. intent.putExtra("msg", "接收静态注册广播成功!");
  34. sendBroadcast(intent);
  35. }
  36. // 发送自定义动态注册广播消息
  37. else if(v.getId() == R.id.send_dynamic){
  38. Log.e("MainActivity", "发送自定义动态注册广播消息");
  39. Intent intent = new Intent();
  40. intent.setAction(DYNAMICACTION);
  41. intent.putExtra("msg", "接收动态注册广播成功!");
  42. sendBroadcast(intent);
  43. }
  44. // 发送系统动态注册广播消息。当手机连接充电设备时会由系统自己发送广播消息。
  45. else if(v.getId() == R.id.send_system){
  46. Log.e("MainActivity", "发送系统动态注册广播消息");
  47. Intent intent = new Intent();
  48. intent.setAction(SYSTEMACTION);
  49. intent.putExtra("msg", "正在充电。。。。");
  50. }
  51. }
  52. }
  53. @Override
  54. protected void onStart() {
  55. super.onStart();
  56. Log.e("MainActivity", "注册广播事件");
  57. // 注册自定义动态广播消息
  58. IntentFilter filter_dynamic = new IntentFilter();
  59. filter_dynamic.addAction(DYNAMICACTION);
  60. registerReceiver(dynamicReceiver, filter_dynamic);
  61. // 注册系统动态广播消息
  62. IntentFilter filter_system = new IntentFilter();
  63. filter_system.addAction(SYSTEMACTION);
  64. registerReceiver(systemReceiver, filter_system);
  65. }
  66. private BroadcastReceiver dynamicReceiver = new BroadcastReceiver() {
  67. @Override
  68. public void onReceive(Context context, Intent intent) {
  69. Log.e("MainActivity", "接收自定义动态注册广播消息");
  70. if(intent.getAction().equals(DYNAMICACTION)){
  71. String msg = intent.getStringExtra("msg");
  72. Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
  73. }
  74. }
  75. };
  76. private BroadcastReceiver systemReceiver = new BroadcastReceiver() {
  77. @Override
  78. public void onReceive(Context context, Intent intent) {
  79. Log.e("MainActivity", "接收系统动态注册广播消息");
  80. if(intent.getAction().equals(SYSTEMACTION)){
  81. String msg = intent.getStringExtra("msg");
  82. Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
  83. }
  84. }
  85. };
  86. }

Step3:接收广播消息。以下为两个静态注册的广播接收器。

[java] view plaincopy

  1. /**
  2. * 自定义静态注册广播消息接收器
  3. * @author zuolongsnail
  4. *
  5. */
  6. public class StaticReceiver extends BroadcastReceiver {
  7. @Override
  8. public void onReceive(Context context, Intent intent) {
  9. String msg = intent.getStringExtra("msg");
  10. Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
  11. }
  12. }

[java] view plaincopy

  1. /**
  2. * 系统静态注册广播消息接收器
  3. *
  4. * @author zuolongsnail
  5. *
  6. */
  7. public class SystemReceiver extends BroadcastReceiver {
  8. @Override
  9. public void onReceive(Context context, Intent intent) {
  10. if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
  11. Log.e("SystemReceiver", "电量低提示");
  12. Toast.makeText(context, "您的手机电量偏低,请及时充电", Toast.LENGTH_SHORT).show();
  13. }
  14. }
  15. }

下面是AndroidManifest.xml文件:

[xhtml] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.byread" android:versionCode="1" android:versionName="1.0">
  4. <application android:icon="@drawable/icon" android:label="@string/app_name">
  5. <activity android:name=".MainActivity" android:label="@string/app_name">
  6. <intent-filter>
  7. <action android:name="android.intent.action.MAIN" />
  8. <category android:name="android.intent.category.LAUNCHER" />
  9. </intent-filter>
  10. </activity>
  11. <!-- 注册自定义静态广播接收器 -->
  12. <receiver android:name=".StaticReceiver">
  13. <intent-filter>
  14. <action android:name="com.byread.static" />
  15. </intent-filter>
  16. </receiver>
  17. <!-- 注册系统静态广播接收器 -->
  18. <receiver android:name=".SystemReceiver">
  19. <intent-filter>
  20. <action android:name="android.intent.action.BATTERY_LOW" />
  21. </intent-filter>
  22. </receiver>
  23. </application>
  24. </manifest>

界面布局文件main.xml

[xhtml] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <TextView android:layout_width="fill_parent"
  6. android:layout_height="wrap_content" android:text="@string/hello" />
  7. <Button android:id="@+id/send_static" android:layout_width="wrap_content"
  8. android:layout_height="wrap_content" android:text="发送自定义静态注册广播" />
  9. <Button android:id="@+id/send_dynamic" android:layout_width="wrap_content"
  10. android:layout_height="wrap_content" android:text="发送自定义动态注册广播" />
  11. <Button android:id="@+id/send_system" android:layout_width="wrap_content"
  12. android:layout_height="wrap_content" android:text="发送系统动态注册广播" />
  13. </LinearLayout>

讲解结束,不过有一点我自己也没弄清楚,这个系统广播事件如果我在程序中sendBroadcast的话,那就是自定义广播了。如果不写的话,那是不是系统自己来发送对应Action广播呢?有知道的同学请告诉我一下,再此先谢过。

运行界面:

Broadcase Receiver 广播接收器详解,布布扣,bubuko.com

时间: 2024-08-10 02:08:13

Broadcase Receiver 广播接收器详解的相关文章

Android广播机制详解

1 广播类型 从广播的注册方式来分,分为以下2种: 静态广播:通过<receiver></receiver>的形式在AndroidManifest.xml中注册的广播: 动态广播:通过context. registerReceiver在程序中显示注册的广播: 上面静态广播和动态广播比较明显的2个区别: (1)静态广播在进程没有运行的时候,也可以收到,这时候会先启动进程,然后处理广播onReceive函数(静态广播可以拉起进程),动态广播因为是在程序中通过代码显示注册的,因此必须要在

淘宝(阿里百川)手机客户端开发日记第六篇 广播机制详解(一)

public abstract class BroadcastReceiver; Base class for code that will receive intents sent by sendBroadcast(). If you don't need to send broadcasts across applications, consider using this class with LocalBroadcastManager instead of the more general

Android面试收集录2 Broadcast Receiver详解

1.Broadcast Receiver广播接收器简单介绍 1.1.定义 Broadcast Receiver(广播接收器),属于Android四大组件之一 在Android开发中,Broadcast Receiver的应用场景非常多.广播,是一个全局的监听器,属于Android四大组件. Android 广播分为两个角色:广播发送者,广播接收者. 1.2.作用 用于监听/接收 应用发出的广播消息,并做出响应. 应用场景 a.不同组件之间通信(包括应用内/不同应用之间) b.与Android系统

AndroidManifest.xml配置文件详解(转载)

AndroidManifest.xml配置文件详解 2013-01-05 10:25:23 分类: Android平台 AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅.下面是一个标准的AndroidManifest.xml文件样例.     [html] view plaincopy <?xml version="1.0" encoding="utf-8"?&g

AndroidManifest.xml配置文件详解 (转)

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅.下面是一个标准的AndroidManifest.xml文件样例. [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <manifest> <!-- 基本配置 --> <uses-permission />

AndroidManifest.xml配置文件详解

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅.下面是一个标准的AndroidManifest.xml文件样例. <?xml version="1.0" encoding="utf-8"?> <manifest> <!-- 基本配置 --> <uses-permission /> <permission />

AndroidManifest.xml配置文件详解(转)

转载博客:http://blog.csdn.net/shagoo/article/details/7485958# AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅.下面是一个标准的AndroidManifest.xml文件样例. <?xml version="1.0" encoding="utf-8"?> <manifest> <!--

Android Broadcast Receiver (广播接收者)

一.简介 Broadcast Receiver是广播接收器,接收自定义和系统的主播.也可以称为监听器. Broadcast Intent与Intent一样是通信的媒介,与Intent不同的是Broadcast Intent同时被多个组件接收. Broadcast Intent广播机制,广播源发出消息,通过AMS(Activity manager service),可以使多个组件接收同一个消息.与Broadcast Intent成对配合应用的是Broadcast Receiver广播接收器,用于,

详解广播机制,Broadcast Receiver,Android进阶必备知识(一)。

直奔主题,关于广播的一些定义什么的我觉得只要是一名合格的初级android开发这都知道吧,我下面要做的就是怎么去使用broadcast receiver. 1.怎么去监听系统广播? Android系统有很多内置的系统广播:电话,短信,时间,地区,电池电量,网络变化等等...那么我们怎么去在我们的应用中实现监听呢?下面我们以监听手机网络发生改变的广播进行监听,都知道广播有两种注册方式,在这里我使用的代码注册的方式,为的是能更好的去理解广播运行机制.在代码中注册一定要注意在你使用完毕的时候一定要反注