版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android广播组件蒋旻、胡威武汉科技大学计算机学院2021年1月
嵌入式系统开发与设计广播简介第7章Android广播机制7.1什么是广播7.2系统广播7.3自定义广播7.4综合示例
(自学)7.1什么是广播在Android中,广播(Broadcast)是一种广泛运用在应用程序之间传输信息的机制。例如来电话了、来短信了、手机没电了等系统发送的消息,也可以是一个应用程序自定义的消息,这些消息通过广播方式通知给应用程序,并让相应的广播接收器去处理消息。广播的消息实质就是将一个Intent对象用sendBroadcast方法发送出去。BroadcastReceiverBroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件,是Android系统的四大组件之一。【返回】7.2系统广播系统广播就是由Android系统发出的广播,如系统启动完成了、来电话了、来短信了、手机没电了、新安装了一个应用程序、在耳机口上插入耳机、设备内存不足、屏幕关闭等等。系统广播示例:在系统启动时播放音乐(1)准备工作:在res文件夹下新建raw文件夹将音乐文件import到raw文件夹中备注:res/raw文件夹通常存放资源文件,如音频、视频等资源res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID,即R.raw.某个资源id;(2)创建广播接收器BroadcastReceiver下一步给这个接收器命名为HelloReceiver自动生成的HelloReceiver.java代码框架:public
classHelloReceiverextendsBroadcastReceiver{publicHelloReceiver(){}@OverridepublicvoidonReceive(Contextcontext,Intentintent){
//此处写收到广播消息后的处理代码
thrownewUnsupportedOperationException("Notyetimplemented");}}当HelloReceiver接收到相应的广播时,会触发onReceive事件去掉这个异常处理在HelloReceiver.java添加处理代码:publicclassHelloReceiverextendsBroadcastReceiver{publicHelloReceiver(){}@OverridepublicvoidonReceive(Contextcontext,Intentintent){
MediaPlayer.create(context,R.raw.start).start();}}添加播放音乐代码start.mp3音乐文件思考:此时系统如何发出广播消息?HelloReceiver如何判断是否接受这个广播?(3)注册接收器(静态注册):在AndroidManifest.xml文件中添加注册信息(红色部分)当广播消息发送以后(本例是系统自动发送),所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的消息(Intent)相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法注册:告诉系统这个BroadcastReceiver要接收哪种广播消息(实质是Intent)<receiverandroid:name="wustzz.helloandroid.HelloReceiver"android:enabled="true"android:exported="true">
<intent-filter><actionandroid:name="ent.action.BOOT_COMPLETED"/></intent-filter></receiver>“系统启动完成”广播用Intent过滤器来设置接收哪种广播黑色代码是创建HelloReceiver接收器时自动创建的系统启动完成时会自动发送“系统启动完成”的广播(4)添加接收广播的权限(有的广播需要添加权限)在AndroidManifest.xml文件中添加权限信息:<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>一些系统广播名称说明BATTERY_LOW电池电量低BOOT_COMPLETED在系统启动完成后,这个动作被广播一次(只有一次)DEVICE_STORAGE_LOW设备内存不足时发出的广播HEADSET_PLUG在耳机口上插入耳机时发出的广播PACKAGE_ADDED新安装了一个应用程序PACKAGE_REMOVED成功删除某个应用程序之后发出的广播TIME_TICK系统时间已经改变。每分钟被广播一次SHUTDOWN
系统关闭PHONE_STATE电话状态改变NEW_OUTGOING_CALL拨打电话时会发送【返回】更多参考:7.3自定义广播主要步骤:(1)发送消息
首先在需要发送信息的地方,把要发送的信息装入一个Intent对象,然后通过调用sendBroadcast(intent)方法,把Intent对象以广播方式发送出去。补充:广播分类普通广播:通过sendBroadcast()方法来发送。它是完全异步的。所有的receivers接收器的执行顺序不确定。有序广播:通过sendOrderedBroadcast()方法来发送。所有的receiver依次执行。即从优先级别最高的广播接收器开始接收,接收完了如果没有丢弃,就下传给下一个次高优先级别的广播接收器进行处理,依次类推,直到最后。有序广播是可以被截获。粘性消息:通过sendStickyBroadcast()方法发送。在发送后就一直存在于系统的消息容器里面,等待对应的receiver去处理,如果暂时没有receiver处理,则一直在消息容器里面处于等待状态。(2)BroadcastReceiver注册
在使用广播时需要在AndroidManifest.xml文件中注册,在使用时则根据注册代码中的intent-filter中的action-name来判断调用哪个广播接收器来处理。
注册BroadcastReceiver有两种方式:
静态注册:在AndroidManifest.xml中,手工用<receiver>标签注册,并在标签内用<intent-filter>标签设置过滤器。
动态注册:动态的在代码中定义并设置好一个IntentFilter对象,然后调用registerReceiver()方法注册。另外有些广播需要有权限才能接收,这需要在AndroidManifest.xml中用<uses-permission>标签声明(3)处理消息
当广播消息(Intent)发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法,消息的处理代码就放在onReceive()方法中。注意事项在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。当onReceive()方法在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(ApplicationNoResponse)的对话框。如果有耗时的工作怎么办?
如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。自定义广播示例将输入值作为广播发送出去接收器接收后显示MainActivityTestReceiverMainActivity主要代码首先在MainActivity中定义:finalStringBROADCAST_ACTION_NAME="wustzz.helloandroid";说明:定义一个字符串常量是作为广播消息的标识,标识名称自定,其值具有唯一性即可。这个标识在后面有3个地方要用:
1.发送广播时:用于创建Intent对象,Intentintent=newIntent(BROADCAST_ACTION_NAME);2.注册时用:作为BroadcastReceiver注册时的intent-filter的actionname用
3.处理消息时:在onReceive()方法中作为消息类型的判断用MainActivity主要代码finalEditTextet=(EditText)findViewById(R.id.editText1);Buttonbt=(Button)findViewById(R.id.button1);bt.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){
Intentintent=newIntent(BROADCAST_ACTION_NAME);Bundlebundle=newBundle();bundle.putString("msg",et.getText().toString());intent.putExtras(bundle);
sendBroadcast(intent);}});TestReceiver主要代码publicclassTestReceiverextendsBroadcastReceiver{publicTestReceiver(){}@OverridepublicvoidonReceive(Contextcontext,Intentintent){ if(intent.getAction().equals("wustzz.helloandroid")){ Stringmsg=(intent.getExtras()).getString("msg"); Toast.makeText(context,"收到广播消息:"+msg, Toast.LENGTH_SHORT).show(); }}}一个Receiver可以注册多个actionname,必要时需要区分注册TestReceiverAndroidManifest.xml文件:红色部分<receiverandroid:name="wustzz.helloandroid.TestReceiver"android:enabled="true"android:exported="true">
<intent-filter><actionandroid:name="wustzz.helloandroid"/></intent-filter></receiver>注册的TestReceiver只接收处理广播标识为“wustzz.helloandroid”的消息【返回】7.4综合示例监听SMS短信信息(SMS,ShortMessagingService)模拟短信黑名单BroadcastReceiver采用动态注册短信监听当短信到来的时候,会发出一个短信到来广播。只要订阅这个广播。就能获取到短信的所有信息。如果想阻止用户收到短信,可以通过设置优先级,让自定义的接收者先获取到广播,然后终止广播,这样用户就接收不到短信了。手机木马拦截短信盗刷银行卡:损失8万未察觉
系统收到短信,发出的广播属于有序广播。手机收到一条短消息的时候系统就会广播一个包含了vider.Telephony.SMS_RECEIVED动作的Intent。只需要自己定义一个广播接收器BroadcastReceiver来过滤这个Intent然后在onReceive()方法里边实现自己的逻辑短信黑名单示例--MainActivity界面(activity_main.xml)<ToggleButtonandroid:id="@+id/toggleButton1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginLeft="74dp"android:layout_marginTop="44dp"android:text="监控SMS"android:textOff="SMS监控已关闭"android:textOn="SMS监控已开启"/>短信黑名单示例--SMSReceiver代码publicclassSMSReceiverextendsBroadcastReceiver{//如果短信中包含"@echo"串就列入黑名单privatestaticfinalStringqueryString="@echo";//黑名单列表ArrayList<String>blackPhoneNum=newArrayList<String>();@Override
publicvoidonReceive(Contextcontext,Intentintent){
if(intent.getAction().equals("vider.Telephony.SMS_RECEIVED")){ SmsManagersms=SmsManager.getDefault(); Bundlebundle=intent.getExtras(); if(bundle!=null){ Object[]pdus=(Object[])bundle.get("pdus"); SmsMessage[]messages=newSmsMessage[pdus.length]; for(inti=0;i<pdus.length;i++) messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]); for(SmsMessagemessage:messages){ Stringmsg=message.getMessageBody(); StringphoneNum=message.getOriginatingAddress(); if(blackPhoneNum.contains(phoneNum)){ //如果在黑名单中,就终止广播,用户也就收不到该用户短信了
abortBroadcast(); } else{ if(msg.toLowerCase().contains(queryString)){ blackPhoneNum.add(phoneNum);//加入黑名单
//自动回发一条短信给to Stringout="denyyou!"; sms.sendTextMessage(phoneNum,null,out,null,null); } } } }}}}获取新短信的代码回发短信遍历短信SmsMessagepublicstaticSmsMessagecreateFromPdu(byte[]pdu)从原始的PDU(protocoldescriptionunits)创建一个SmsMessage。这个方法很重要,在我们编写短信接收程序要用到,它从我们接收到的广播意图中获取的字节创建SmsMessage。publicStringgetOriginatingAddress()以String返回SMS信息的来电地址,或不可用时为null。publicStringgetMessageBody()以一个String返回消息的主体,如果它存在且是基于文本的。短信黑名单示例--获取短信说明SMS广播Intent包含了新来SMS的细节。为了提取包装在SMS广播Intent的Bundle中的SmsMessage对象数组,使用pdus:
Bundlebundle=intent.getExtras();if(bundle!=null){Object[]pdus=(Object[])bundle.get(“pdus”);SmsMessage[]messages=newSmsMessage[pdus.length];for(inti=0;i<pdus.length;i++)messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]);}
每个SmsMessage对象包含SMS
消息的细节,包括源地址(手机号),时间和消息体。此调用返回一个在PDU模式中定义的对象数组,PDU是一种表示SMS消息的行业标准方式。然后可以将PDU转换为AndroidSmsMessage对象。ProtocolDescriptionUnit,协议描述单元调用SmsMessage.createFromPdu,创建SmsMessage对象数组短信黑名单示例--AndroidManifest.xml添加SMS权限<uses-permis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省郯城县郯城街道初级中学初中信息技术《工作表的格式化与打印》教案1
- 家庭运动后恢复休息制度
- 江苏省扬州市西湖实验学校高考地理 产业活动与地理环境教学设计
- 高中语文上学期第2周 鉴赏诗歌表达技巧教学设计
- HR新人必修课:快速适应与成长
- 执行力的5个黄金法则
- 2026综合评标专家-湖南-湖南综合评标专家(工程勘察、工程设计类)历年参考题库含答案详解
- 2026综合评标专家-吉林-吉林综合评标专家(工程造价类)历年参考题库含答案详解
- 2026综合类-银行业中级资格考试-法律法规与综合能力第二十一章历年真题摘选带答案详解
- 2026综合类-轮机工程-构件内力及杆件变形历年真题摘选带答案详解
- 湖南省(2026年)公开遴选公务员笔试题及答案解析(B类)
- 2026国考行测言语理解必背高频成语(完整版考场专用)
- (正式版)DB31∕T 885-2024 《 老旧住宅电梯安全评估规范》
- 华安证券股份有限公司招聘笔试题库2026
- 电动重卡充电站技术规范解读
- 初中体育与健康教案 《花球啦啦操基本手位动作及层次创编》教学设计
- 临床心理护理技巧与案例分析
- 2025-2026学年种多肉教案
- 2026天津师范大学第二批招聘(辅导员、专业技术辅助岗位)27人考试备考试题及答案解析
- 研学汇报教学课件
- 论文润色合同范本
评论
0/150
提交评论