BroadcastReceiver 用于接收广播
BroadcastReceiver 用于异步接收广播Intent。主要有两大类,用于接收广播的:
- 正常广播 Normal broadcasts(用
Context.sendBroadcast
()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。 - 有序广播 Ordered broadcasts(用
Context.sendOrderedBroadcast()
发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。
- 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();
- }
- }
- }
- }
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(); } } }
}
1. 静态方式,在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
- <receiver android:name=".SMSReceiver">
- <intent-filter>
- <action android:name="android.provider.Telephony.SMS_RECEIVED" />
- </intent-filter>
- </receiver>
<receiver android:name=".SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter>
</receiver>
2. 动态方式, 在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。
- 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();
- }
- }
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(); }
}
而且动态注册,需要特别注意的是,在退出程序前要记得调用Context.unregisterReceiver()方法。一般在activity的onStart()里面进行注册, onStop()里面进行注销。官方提醒,如果在Activity.onResume()里面注册了,就必须在Activity.onPause()注销。
Permission权限
要接收某些action,需要在AndroidManifest.xml里面添加相应的permission。例如接收SMS:
- uses-permission android:name="android.permission.RECEIVE_SMS" />
uses-permission android:name="android.permission.RECEIVE_SMS" />
- public class CallReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
- switch(teleManager.getCallState()){
- case TelephonyManager.CALL_STATE_RINGING: //响铃
- Toast.makeText(context, "Ringing: " + intent.getStringExtra("incoming_number"), Toast.LENGTH_LONG).show();
- break;
- case TelephonyManager.CALL_STATE_OFFHOOK: //接听
- Toast.makeText(context, "OffHook: " + intent.getStringExtra("incoming_number"), Toast.LENGTH_LONG).show();
- break;
- case TelephonyManager.CALL_STATE_IDLE: //挂断
- Toast.makeText(m_context, "Idle: " + incomingNumber, Toast.LENGTH_LONG).show();
- break;
- }
- }
- }
转载于:https://www.cnblogs.com/ggzjj/archive/2013/01/12/2857288.html
BroadcastReceiver 用于接收广播相关推荐
- BroadcastReceiver(接收广播)
Broadcast Receiver用于接收并处理广播通知(broadcast announcements).多数的广播是系统发起的,如地域变换.电量不足.来电来信等.程序也可以播放一个广播.程序可以 ...
- [2021.11.6]使用BroadcastReceiver发送和接收广播
1 BroadcastReceiver简介 BroadcastReceiver类是所有广播接收器的抽象基类,子类对接收的广播进行筛选并做出响应.广播接收器的生命周期短,当广播消息到达时,调用onRec ...
- Android——发送和接收广播
一,发送广播 利用Intent来发送广播. 使用:在需要发送广播的地方创建一个Intent对象,将信息的内容和用于过滤的信息封装起来,通过以下三种方法将Intent广播出去: 1,Context.se ...
- BroadcastReceiver之动态广播 demo+笔记
在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的机制.而BroadcastReceiver是对发送出来的 Broadcast进行过滤接收并响应的一类组件(任何一个程序都能接 ...
- android 发送广播 接收广播 动态广播接收
1. 静态广播 见网址: http://www.devdiv.com/forum.php?mod=viewthread&tid=48614 2.同时多个动态广播 private Broadca ...
- android 无法接收广播_别告诉我你不认识Android中广播接收者(二)
前面我们了解了什么是广播接收者与广播接收者的创建,这一次我们要接着继续去了解广播接收者的相关知识,这些知识包括广播接收者的注册.自定义广播与广播的类型. 当我们学习完广播接收者之后,该如何才能让它起到 ...
- react-native 发送接收“广播”
发送广播 DeviceEventEmitter.emit 接收广播 listener = DeviceEventEmitter.addListener 移除广播 this.listener.remov ...
- Linux上接收广播
在windows上接收广播比较简单:使用setsockopt结合SO_BROADAST即可.但是同样的代码不能在linux上获得同样的效果. 使用tcpdump监听,确实收到了广播包: stackov ...
- Android,开启wifi接收广播
最近做个小东西,发现手机怎么也接收不到电脑发出去的广播数据包.后来上网查,不少人都有这个问题,有人说是手机的硬件bug. 后来在谷歌文档找了半天,突然发现原来是系统默认是把广播接收锁住了,因为接收广播 ...
- HackRF结合GnuRadio发射接收广播
前言 本科毕设老板给了这块板子,网上也看了一些教程,但感觉实际有用的例子也不是很多,WBFM广播的发射接收是一个很好的入门的例子啦,废话不多说,就说说我实际一套操作下来的感受和心得吧. 环境配置 参考 ...
最新文章
- 河南省第十届大学生程序设计竞赛 A,B,C,D,F,G,H 题解
- 监控HP服务器cpu状态脚本
- java8 stream 做累加_Java8新特性之Stream(上)|乐字节
- 【TensorFlow】tf.concat的用法
- java为什么还需要分布式锁?
- Redis 的 8 大应用场景
- 整合Flume和Kafka完成实时数据采集
- [Unity2018.2]ShaderGraph更新详解
- 微软遭30万人实名抗议:非人道的1914万美元,能不能别赚?
- Minecraft InputFix
- python编程是啥-小学生都开始学的Python编程到底是什么?
- php采集规则编写,织梦dedecms图片采集规则的编写方法
- NLPIR-JAVA版本-MAC-LINUX-WINDOWS操作系统均适用
- 类似微信的即时通讯服务器,除了微信,还有这些常用即时通讯APP
- 数据安全--安全网关
- 赏析角度有哪些_名句鉴赏题从哪些角度入手鉴赏?一线名师告诉你:五个角度...
- vue小白的自学笔记
- android twitter第三方登录,android中接入twitter进行第三方登录
- async-supported的作用
- 第7-3课:K 最邻近算法(KNN)与手写数字识别
热门文章
- Linux内核学习之路_1_编译Linux内核
- Windows核心编程_Visual Studio2019找不到MFC项目
- cut\grep\awk\sed命令详解
- 《从零开始学Swift》学习笔记(Day 32)——计算属性
- javaScript与MVC
- Nginx 静态页面POST 请求提示405 Not Allowed
- 彻底了解HASH算法及应用(一)
- Spring或Hibernate其实都提供了透明处理Clob的方法
- DHTML【4】--HTML
- English trip M1 - AC9 Nosey people 爱管闲事的人 Teacher:Solo