BroadcastReceiver

广播接受者广播(BroadcastReceiver

四大组件之一

说道广播接受者,我们就要知道,广播。

广播(broadcast):是一种机制。操作系统发出广播。

程序自己也可以发出广播。


类型分别有两种

普通广播(Normalbroadcasts):完全异步,可以同时被所有接收者接收到

有序广播(Orderedbroadcasts):按照接收者声明的优先级别,被接收者依次接收广播

广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。

1.png

广播接收者BroadcastReceiver :优先级-1000~ 1000(整数的最大值)

继承BroadcastReceiver,实现onReceive()方法


注册(两种方式)

通过配置文件完成注册

  1. <receiverandroid:namereceiverandroid:name=".SmsReceiver">  
  2.            订阅广播  
  3.           <intent-filter >  
  4.                   广播的动作名称  
  5.                 <actionandroid:nameactionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  
  6.           </intent-filter>  
  7. </receiver>  


通过代码完成注册

  1. //通过代码订阅短信广播  
  2. IntentFilter intentFilter = newIntentFilter  
  3.     ("android.provider.Telephony.SMS_RECEIVED");  
  4. receiver = new SmsReceiver();  
  5. //订阅广播  
  6. registerReceiver(receiver, intentFilter);  

相应广播接收要给予相应权限

设置短信接收权限

  1. <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.RECEIVE_SMS"/>  

设置优先级别

配置文件中设置:<intent-filterandroid:priority="1000">

代码中设置:intentFilter.setPriority(1000);


BroadcastReceiver的响应性

1.广播接收者BroadcastReceiver不需要显示调用启动,由系统调用

2.每次广播消息到来时都会创建BroadcastReceiver实例,然后调用onReceiver()方法, onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。

3.onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应,弹出ANR错误对话框。

4.不要在广播接收者中创建子线程来执行耗时操作,不可靠。

5.在广播接收者中不应该执行耗时的操作、如果有耗时操作需要创建服务、由服务来执行耗时操作。

6.如果在广播接收者或服务中启动Activity,需要对意图进行如下设置。

  1. //指定一个标志:在新的任务栈打开  
  2. tent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  


SmsBroadcastReceiver

  1. public class SmsReceiver extends BroadcastReceiver {  
  2.        @Override  
  3.        publicvoid onReceive(Context context, Intent intent) {  
  4.               // TODO Auto-generated method stub  
  5.               System.out.println("爷已经接收到短信。。。");  
  6.               Object[] objs = (Object[]) intent.getExtras().get("pdus");  
  7.               for(Object objbjs){  
  8.                      //短信对象  
  9.                      SmsMessagemsg = SmsMessage.createFromPdu((byte[])obj);  
  10.                      //号码  
  11.                      Stringaddress = msg.getDisplayOriginatingAddress();  
  12.                      //时间  
  13.                      longtime = msg.getTimestampMillis();  
  14.                        
  15.                      SimpleDateFormatformat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  16.                      Stringt = format.format(time);  
  17.                        
  18.                      //短信内容  
  19.                      Stringbody = msg.getDisplayMessageBody();  
  20.                        
  21.                      Log.i("i","人"+address);  
  22.                      Log.i("i","时间"+t);  
  23.                      Log.i("i","内容"+body);  
  24.               }  
  25.                 
  26.        //中断广播 类似于拦截(要设置优先级,保证该广播接受者是第一个操作短信广播的)  
  27.               abortBroadcast();  
  28.        }  
  29. }  

Xml:

  1. <!-- 订阅广播 -->  
  2.        <receiver android:name=".SmsReceiver">  
  3.            <intent-filter android:priority="1000">  
  4.                 <actionandroid:nameactionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  
  5.            </intent-filter>  
  6.        </receiver>  

所需权限:

  1. <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.RECEIVE_SMS"/>  


PhoneBroadcastReceiver

外拨电话:也会发出一个广播。有序广播,并且指定了广播接收者。是无法中断-- 另外一个广播接收者进行判断:号码是否为空

  1. public class PhoneReceiver extendsBroadcastReceiver {  
  2.        @Override  
  3.        publicvoid onReceive(Context context, Intent intent) {  
  4.               // TODO Auto-generated method stub  
  5.               Log.i("i","拦截到外拨电话。。。");  
  6.                 
  7.               //添加ip号码 1 先得到号码 2 设置ip号码  
  8.                 
  9.               String number = getResultData();  
  10.               String ipNumber ="17951"+number;  
  11.                 
  12.               //setResultData(ipNumber);  
  13.                 
  14.               //中断广播  
  15. //       setResultData(null);                
  16. //            abortBroadcast();  
  17.                 
  18.               if("5558".equals(number)){  
  19.                      setResultData("110");  
  20.               }  
  21.        }  
  22. }  

Xml

  1. <receiver  
  2.            android:name=".PhoneReceiver">  
  3.            <intent-filter android:priority="1000">  
  4.                 <actionandroid:nameactionandroid:name="android.intent.action.NEW_OUTGOING_CALL"/>  
  5.            </intent-filter>  
  6.        </receiver>  

所需权限:

  1. <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"/>  


CustomBroadcastReceiver:

MainAcivity:

  1. //发送广播  
  2.         Intent intent = new Intent();  
  3.         intent.setAction("com.huaao.qjq.action.money");  
  4.         intent.putExtra("name""天曾");  
  5.         sendBroadcast(intent);//发送普通广播  
  6.         //sendOrderedBroadcast(intent,receiverPermission)//发送有序广播  

MyBroadcast:

  1. public classMyReceiver extends BroadcastReceiver {  
  2.        @Override  
  3.        public void onReceive(Context context,Intent intent) {  
  4.           
  5.               Stringname = intent.getStringExtra("name");  
  6.               System.out.println("姓名:" + name);  
  7.                 
  8.               //广播接收是不占据任务栈,指定一个标志:在新的任务栈打开  
  9.                 
  10.               Intenti = new Intent(context,OtherActivity.class);  
  11.               //指定一个标志:在新的任务栈打开  
  12.               i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  13.               context.startActivity(i);  
  14.        }  
  15. }  

Xml:

  1. <receiver android:name=".MyReceiver">  
  2.                 <intent-filter>  
  3.                       
  4.                     <actionandroid:nameactionandroid:name="com.huaao.qjq.action.money"/>  
  5.                 </intent-filter>  
  6.            </receiver>  


课后问题

广播注册的两种方式?

Java代码

//通过代码订阅短信广播

IntentFilter intentFilter = newIntentFilter

    ("android.provider.Telephony.SMS_RECEIVED");

receiver = new SmsReceiver();

//订阅广播

registerReceiver(receiver, intentFilter);

Xml配置

<receiverandroid:name=".SmsReceiver">

           订阅广播

          <intent-filter >

                  广播的动作名称

                <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>

          </intent-filter>

</receiver>


广播有几类?

普通广播:完全异步,同时被接受者接收到

有序广播:按优先级,依次传播。

广播的优先级别?-1000~ 1000

-1000 ~ 1000(整数最大值)


怎么中断广播?

abortBroadcast();


xml  代码配置那个最新接受?

xml是操作系统去管理

-代码配置是程序自己管理,设置在内存中。代码配置级别高  程序运行先加载内存

那如果两个广播接收者都是xml配置优先级一样那个先接受呢?

安装的顺序。

课后不懂:

在广播接受者启动intent   为什么要设置标识

必须加标识位。 不属于用户应用。

sendOrderedBroadcast(intent, receiverPermission)
期末大作业基于python的足球运动员数据分析源码+数据集(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于python的足球运动员数据分析源码+数据集(高分项目)期末大作业基于pyth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值