版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章全局大喇叭,详解广播机制广播机制简介为了便于进行系统级别的消息通知,Android引入了一套广播消息机制。每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。Android提供了一套完整的API,允许应用程序自由地发送和接收广播。Android中的广播主要可以分为两种类型:标准广播和有序广播。标准广播标准广播(normalbroadcasts)是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎都会在同一时刻接收到收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。示意图如下:有序广播有序广播(orderedbroadcasts)是一种同步执行的广播,在广播发出之后,同一时刻只会有一个BroadcastReceiver能够收到这条广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,广播才会继续传递。所以此时的BroadcastReceiver是有先后顺序的,优先级高的BroadcastReceiver就可以先收到广播消息,并且前面的BroadcastReceiver还可以截断正在传递的广播,这样后面的BroadcastReceiver就无法收到广播消息了。示意图如下:接收系统广播接收系统广播开发者可以根据自己感兴趣的广播,自由地注册BroadcastReceiver,这样当有相应的广播发出时,相应的BroadcastReceiver就能够收到该广播,并可以在内部进行逻辑处理。注册BroadcastReceiver的方式一般有两种:在代码中注册和在AndroidManifest.xml中注册。其中前者也被称为动态注册,后者也被称为静态注册。动态注册监听时间变化动态注册的代码示例如下:classMainActivity:AppCompatActivity(){lateinitvartimeChangeReceiver:TimeChangeReceiveroverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)valintentFilter=IntentFilter()intentFilter.addAction("ent.action.TIME_TICK")timeChangeReceiver=TimeChangeReceiver()registerReceiver(timeChangeReceiver,intentFilter)}overridefunonDestroy(){super.onDestroy()unregisterReceiver(timeChangeReceiver)}innerclassTimeChangeReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){Toast.makeText(context,"Timehaschanged",Toast.LENGTH_SHORT).show()}}}监听到系统时间发生了变化静态注册实现开机启动静态注册的代码示例如下:classBootCompleteReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){Toast.makeText(context,"BootComplete",Toast.LENGTH_LONG).show()}
}静态注册实现开机启动另外,静态的BroadcastReceiver一定要在AndroidManifest.xml文件中注册才可以使用:<manifestxmlns:android="/apk/res/android"package="com.example.broadcasttest"><uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme">…<receiverandroid:name=".BootCompleteReceiver"android:enabled="true"android:exported="true"><intent-filter><actionandroid:name="ent.action.BOOT_COMPLETED"/></intent-filter></receiver></application></manifest>接收系统开机广播发送自定义广播发送标准广播构建一个Intent对象,并把要发送的广播的值传入。然后调用Intent的setPackage()方法,并传入当前应用程序的包名。最后调用sendBroadcast()方法将广播发送出去,这样所有监听com.example.broadcasttest.MY_BROADCAST这条广播的BroadcastReceiver就会收到消息了。此时发出去的广播就是一条标准广播。classMainActivity:AppCompatActivity(){
overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)button.setOnClickListener{valintent=Intent("com.example.broadcasttest.MY_BROADCAST")intent.setPackage(packageName)sendBroadcast(intent)}}
}发送有序广播和标准广播不同,有序广播是一种同步执行的广播,并且是可以被截断的。classMainActivity:AppCompatActivity(){
overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)button.setOnClickListener{valintent=Intent("com.example.broadcasttest.MY_BROADCAST")intent.setPackage(packageName)
sendOrderedBroadcast(intent,null)}}
}发送有序广播只需要改动一行代码,即将sendBroadcast()方法改成sendOrderedBroadcast()方法。接收自定义广播在发送广播之前,我们还是需要先定义一个BroadcastReceiver来准备接收此广播,不然发出去也是白发。因此新建一个MyBroadcastReceiver,并在onReceive()方法中加入如下代码:classMyBroadcastReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){Toast.makeText(context,"receivedinMyBroadcastReceiver",Toast.LENGTH_SHORT).show()}}接收自定义广播然后在AndroidManifest.xml中对这个BroadcastReceiver进行注册:<manifestxmlns:android="/apk/res/android"package="com.example.broadcasttest">…<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme">…<receiverandroid:name=".MyBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter><actionandroid:name="com.example.broadcasttest.MY_BROADCAST"/></intent-filter></receiver></application></manifest>点击按钮后收到广播Kotlin课堂定义高阶函数如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数。funexample(func:(String,Int)->Unit){func("hello",123)}可以看到,这里的example()函数接收了一个函数类型的参数,因此example()函数就是一个高阶函数。而调用一个函数类型的参数,它的语法类似于调用一个普通的函数,只需要在参数名的后面加上一对括号,并在括号中传入必要的参数即可。内联函数的作用内联函数可以将使用Lambda表达式带来的运行时开销完全消除。它的工作原理并不复杂,就是Kotlin编译器会将内联函数中的代码在编译的时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 润滑油脂生产工安全宣贯知识考核试卷含答案
- 耐火纤维制品成型工岗前潜力考核试卷含答案
- 园林康养师班组评比测试考核试卷含答案
- 涂料调配工岗中交接考核试卷含答案
- 火工品管理工安全实践竞赛考核试卷含答案
- 中国废弃食用油行业市场规模及发展前景研究报告(智研咨询)
- 三七灰土换填施工方案(3篇)
- 2026年最-新中小学教师招聘考试教育综合知识试题与答案
- 110KV变电站土建工程施工方案
- Z世代审美迭代驱动塑胶镜框色彩工艺创新的研发回报率
- 第1课 法律是什么 第2课时 课件(内嵌视频)2026-2027学年道德与法治六年级上册统编版
- 物理性能检验员岗位师带徒考核试卷含答案
- 《政府与非营利组织会计(第3版)》全套教学课件
- Java程序设计入门与实战(微课版)
- 2025年四川省成都市技能人才评价考评员考试题库及答案
- 挂靠地址合同协议
- 帕金森病患者的运动并发症护理
- (2026)外耳道胆脂瘤诊断与治疗专家共识课件
- 2026安徽宿州市总工会招聘14人重点基础提升(共500题)附带答案详解
- 揿针疗法在儿科的应用
- 2025年临床基因扩增检验技术人员上岗证考试题(附答案)
评论
0/150
提交评论