BroadcastReceiver 用于异步接收广播Intent。主要有两大类,用于接收广播的:

  • 正常广播 Normal broadcasts(用 Context.sendBroadcast()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。
  • 有序广播 Ordered broadcasts(用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。
要注意的是,即使是Normal broadcasts,系统在某些情况下可能会恢复到一次传播给一个receiver。 特别是receiver可能需要创建一个进程,为了避免系统超载,只能一次运行一个receiver。
Broadcast Receiver 并没有提供可视化的界面来显示广播信息。可以使用Notification和Notification Manager来实现可视化的信息的界面,显示广播信息的内容,图标及震动信息。
生命周期
一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。
发送广播
事件的广播比较简单,构建Intent对象,可调用sendBroadcast(Intent)方法将广播发出。另外还有sendOrderedBroadcast(),sendStickyBroadcast()等方法,请查阅API Doc。
1.new Intent with action name 
Intent intent = new Intent(String action);
或者 只是new Intent, 然后
intent.setAction(String action);
2.set data等准备好了后,in activity,
sendBroadcast(Intent); // 发送广播
接收广播
通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件。
[java] view plaincopyprint?
  1. public class SMSReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. // get data from SMS intent
  5. Bundle bundle = intent.getExtras();
  6. if (bundle != null){
  7. // get message by "pdus"
  8. Object[] objArray = (Object[]) bundle.get("pdus");
  9. // rebuild SMS
  10. SmsMessage[] messages = new SmsMessage[objArray.length];
  11. for (int i=0; i < objArray.length; i++){
  12. messages[i] = SmsMessage.createFromPdu((byte[])objArray[i]);
  13. StringBuilder str = new StringBuilder("from: ");
  14. str.append(messages[i].getDisplayOriginatingAddress());
  15. str.append("\nmessage:\n");
  16. str.append(messages[i].getDisplayMessageBody());
  17. Toast.makeText(context, str.toString(), Toast.LENGTH_LONG)
  18. .show();
  19. }
  20. }
  21. }
  22. }
public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // get data from SMS intent Bundle bundle = intent.getExtras(); if (bundle != null){ // get message by "pdus" Object[] objArray = (Object[]) bundle.get("pdus"); // rebuild SMS SmsMessage[] messages = new SmsMessage[objArray.length]; for (int i=0; i < objArray.length; i++){ messages[i] = SmsMessage.createFromPdu((byte[])objArray[i]); StringBuilder str = new StringBuilder("from: "); str.append(messages[i].getDisplayOriginatingAddress()); str.append("\nmessage:\n"); str.append(messages[i].getDisplayMessageBody()); Toast.makeText(context, str.toString(), Toast.LENGTH_LONG) .show(); } } }
}
注册Receiver
注册有两种方式:
   1. 静态方式,在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
[html] view plaincopyprint?
  1. <receiver android:name=".SMSReceiver">
  2. <intent-filter>
  3. <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  4. </intent-filter>
  5. </receiver>
<receiver android:name=".SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter>
</receiver>

2. 动态方式, 在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。

[java] view plaincopyprint?
  1. public class HelloDemo extends Activity {
  2. private BroadcastReceiver receiver;
  3. @Override
  4. protected void onStart() {
  5. super.onStart();
  6. receiver = new CallReceiver();
  7. registerReceiver(receiver, new IntentFilter("android.intent.action.PHONE_STATE"));
  8. }
  9. @Override
  10. protected void onStop() {
  11. unregisterReceiver(receiver);
  12. super.onStop();
  13. }
  14. }
public class HelloDemo extends Activity {    private BroadcastReceiver receiver;    @Override protected void onStart() { super.onStart(); receiver = new CallReceiver(); registerReceiver(receiver, new IntentFilter("android.intent.action.PHONE_STATE")); } @Override protected void onStop() { unregisterReceiver(receiver); super.onStop(); }
}
一个receiver可以接收多个action的,即可以有多个intent-filter,需要在onReceive里面对intent.getAction(action name)进行判断。
 
个人推荐使用静态注册方式,由系统来管理receiver,而且程序里的所有receiver,可以在xml里面一目了然。而动态注册方式,隐藏在代码中,比较难发现。
    而且动态注册,需要特别注意的是,在退出程序前要记得调用Context.unregisterReceiver()方法。一般在activity的onStart()里面进行注册, onStop()里面进行注销。官方提醒,如果在Activity.onResume()里面注册了,就必须在Activity.onPause()注销。

Permission权限
  要接收某些action,需要在AndroidManifest.xml里面添加相应的permission。例如接收SMS:

[html] view plaincopyprint?
  1. uses-permission android:name="android.permission.RECEIVE_SMS" />
uses-permission android:name="android.permission.RECEIVE_SMS" />
下面给出动态注册的接收来电的广播处理的CallReceiver的代码:
一种方式是直接读取intent.getStringExtra("incoming_number")来获取来电号码:
[java] view plaincopyprint?
  1. public class CallReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
  5. switch(teleManager.getCallState()){
  6. case TelephonyManager.CALL_STATE_RINGING: //响铃
  7. Toast.makeText(context, "Ringing: " + intent.getStringExtra("incoming_number"), Toast.LENGTH_LONG).show();
  8. break;
  9. case TelephonyManager.CALL_STATE_OFFHOOK: //接听
  10. Toast.makeText(context, "OffHook: " + intent.getStringExtra("incoming_number"), Toast.LENGTH_LONG).show();
  11. break;
  12. case TelephonyManager.CALL_STATE_IDLE: //挂断
  13. Toast.makeText(m_context, "Idle: " + incomingNumber, Toast.LENGTH_LONG).show();
  14. break;
  15. }
  16. }
  17. }

转载于:https://www.cnblogs.com/ggzjj/archive/2013/01/12/2857288.html

BroadcastReceiver 用于接收广播相关推荐

  1. BroadcastReceiver(接收广播)

    Broadcast Receiver用于接收并处理广播通知(broadcast announcements).多数的广播是系统发起的,如地域变换.电量不足.来电来信等.程序也可以播放一个广播.程序可以 ...

  2. [2021.11.6]使用BroadcastReceiver发送和接收广播

    1 BroadcastReceiver简介 BroadcastReceiver类是所有广播接收器的抽象基类,子类对接收的广播进行筛选并做出响应.广播接收器的生命周期短,当广播消息到达时,调用onRec ...

  3. Android——发送和接收广播

    一,发送广播 利用Intent来发送广播. 使用:在需要发送广播的地方创建一个Intent对象,将信息的内容和用于过滤的信息封装起来,通过以下三种方法将Intent广播出去: 1,Context.se ...

  4. BroadcastReceiver之动态广播 demo+笔记

    在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制.而BroadcastReceiver是对发送出来的 Broadcast进行过滤接收并响应的一类组件(任何一个程序都能接 ...

  5. android 发送广播 接收广播 动态广播接收

    1. 静态广播 见网址: http://www.devdiv.com/forum.php?mod=viewthread&tid=48614 2.同时多个动态广播 private Broadca ...

  6. android 无法接收广播_别告诉我你不认识Android中广播接收者(二)

    前面我们了解了什么是广播接收者与广播接收者的创建,这一次我们要接着继续去了解广播接收者的相关知识,这些知识包括广播接收者的注册.自定义广播与广播的类型. 当我们学习完广播接收者之后,该如何才能让它起到 ...

  7. react-native 发送接收“广播”

    发送广播 DeviceEventEmitter.emit 接收广播 listener = DeviceEventEmitter.addListener 移除广播 this.listener.remov ...

  8. Linux上接收广播

    在windows上接收广播比较简单:使用setsockopt结合SO_BROADAST即可.但是同样的代码不能在linux上获得同样的效果. 使用tcpdump监听,确实收到了广播包: stackov ...

  9. Android,开启wifi接收广播

    最近做个小东西,发现手机怎么也接收不到电脑发出去的广播数据包.后来上网查,不少人都有这个问题,有人说是手机的硬件bug. 后来在谷歌文档找了半天,突然发现原来是系统默认是把广播接收锁住了,因为接收广播 ...

  10. HackRF结合GnuRadio发射接收广播

    前言 本科毕设老板给了这块板子,网上也看了一些教程,但感觉实际有用的例子也不是很多,WBFM广播的发射接收是一个很好的入门的例子啦,废话不多说,就说说我实际一套操作下来的感受和心得吧. 环境配置 参考 ...

最新文章

  1. 河南省第十届大学生程序设计竞赛 A,B,C,D,F,G,H 题解
  2. 监控HP服务器cpu状态脚本
  3. java8 stream 做累加_Java8新特性之Stream(上)|乐字节
  4. 【TensorFlow】tf.concat的用法
  5. java为什么还需要分布式锁?
  6. Redis 的 8 大应用场景
  7. 整合Flume和Kafka完成实时数据采集
  8. [Unity2018.2]ShaderGraph更新详解
  9. 微软遭30万人实名抗议:非人道的1914万美元,能不能别赚?
  10. Minecraft InputFix
  11. python编程是啥-小学生都开始学的Python编程到底是什么?
  12. php采集规则编写,织梦dedecms图片采集规则的编写方法
  13. NLPIR-JAVA版本-MAC-LINUX-WINDOWS操作系统均适用
  14. 类似微信的即时通讯服务器,除了微信,还有这些常用即时通讯APP
  15. 数据安全--安全网关
  16. 赏析角度有哪些_名句鉴赏题从哪些角度入手鉴赏?一线名师告诉你:五个角度...
  17. vue小白的自学笔记
  18. android twitter第三方登录,android中接入twitter进行第三方登录
  19. async-supported的作用
  20. 第7-3课:K 最邻近算法(KNN)与手写数字识别

热门文章

  1. Linux内核学习之路_1_编译Linux内核
  2. Windows核心编程_Visual Studio2019找不到MFC项目
  3. cut\grep\awk\sed命令详解
  4. 《从零开始学Swift》学习笔记(Day 32)——计算属性
  5. javaScript与MVC
  6. Nginx 静态页面POST 请求提示405 Not Allowed
  7. 彻底了解HASH算法及应用(一)
  8. Spring或Hibernate其实都提供了透明处理Clob的方法
  9. DHTML【4】--HTML
  10. English trip M1 - AC9 Nosey people 爱管闲事的人 Teacher:Solo