Broadcast初识|青训营笔记
这是我参与[第四届青训营]笔记创作活动的第4天
前言
本文将从广播简介,广播类型,使用方式,三个方面来介绍广播
1.什么是广播
广播,是一个用于Android 应用发送或接收来自 Android 系统和其他 Android 应用消息的消息传递监听组件,也是Android四大组件之一。
2.广播类型
广播类型有两种,一种为标准广播,另一种为有序广播,两种广播的使用方式都有所不同,接下来就重点介绍一下两种广播,以及他们的使用方式。
- 标准广播:是一种完全异步执行的广播,在发出广播后,所有的广播接收器都会在同一时刻接收到这条广播通知,没有先后顺序。
- 有序广播:是一种同步执行的广播,在广播发出后,同一时刻只有一个广播接收器能够接收到,广播接收器存在先后顺序,优先级高的接收器先接收,处于前面接收的接收器可以切断正在传递的广播,也就无法让后面的接收器接收信息。
3.使用方式
系统广播
接收广播
在接收广播的时候,我们需要注册广播接收器,来接收我们的广播信息,广播接收器的注册方式有两种,静态注册,动态注册。
- 静态注册
在AndroidManifest.xml中使用标签注册,使用方式如下
<receiver
android:name=".StateReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!--设置要接收的广播action-->
<action android:name="android.intent.action.XXXXXX"/>
</intent-filter>
</receiver>
class StaticReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//根据接收的广播action,做出反馈
}
}
- 动态注册
在代码中进行设置IntentFiler,然后添加想监听什么广播就写对应的action就行,最后一定要调用unregisterReceiver方法来取消注册监听的广播。
//在Activity/Fragment中设置动态注册广播接收器
class MainActivity : AppCompatActivity() {
//广播对象
lateinit var receiver:DynamicReceiver = DynamicReceiver()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//设置监听的action
val filer = IntentFilter()
filer.addAction("android.intent.action.XXXXXXXXXX")
//注册广播和意图过滤器
registerReceiver(receiver,filer)
}
override fun onDestroy() {
super.onDestroy()
//最后在该activity/Fragment销毁时解绑广播
unregisterReceiver(receiver)
}
//创建你所需要广播的内容
inner class DynamicReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//根据接收的广播action,做出反馈
}
}
}
那么两种注册方式会有什么区别吗,大家可以思考一下❓在不同的场景下又会产生怎样的效果❓
1.动态注册广播,不是常驻型广播,它跟随着activity的生命周期,activity销毁前,会移除广播接收器,静态注册则是常驻型广播,代表着应用程序结束了,他也不会失去作用,只要系统接受到相关action,那么系统就会调用该广播所属程序。
2.就优先级来说,默认广播下的静态广播都默认在动态广播之后;如果为有序广播则同优先级的动态优于静态广播。
发送广播
学习完了怎么接收广播,那接下来我们来试试怎样发送广播👀
在首先我们自定义一个广播接收器,要不等会忘记定义接收器,就会看不到发送广播的效果,那就O(∩_∩)O哈哈了,我们就采用静态注册的方式来吧❗️
//接收器
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Toast.makeText(context, "msg", Toast.LENGTH_SHORT).show()
}
}
接着在AndroidManifest.xml中注册,并设置intent-filter
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.bytedance.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
最后在activity中发送广播
class MainActivity : AppCompatActivity() {
private lateinit var binding:ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
//设置按钮点击事件
binding.sendBroadcast.setOnClickListener {
//有序广播
sendOrderBroadcast(Intent("com.bytedance.broadcasttest.MY_BROADCAST"),null)
//标准广播
sendBroadcast(Intent("com.bytedance.broadcasttest.MY_BROADCAST"))
}
}
}
完成以上操作你就可以在点击按钮后能接收到你发送广播的信息了
本地广播
前面大部分,讲的都是系统广播,现在我们来讲讲本地广播的使用吧
首先,本地广播跟系统广播对比,它无需其他应用在收发您的广播时带来的任何安全问题。本地广播可在应用中作为通用的发布/订阅事件总线,而不会产生任何系统级广播开销。接下来以动态注册的方式来写一个本地广播
class MainActivity : AppCompatActivity() {
private lateinit var binding:ActivityMainBinding
lateinit var local: LocalBroadcastManager
lateinit var receiver: DynamicReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//视图绑定
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
//发送本地广播
binding.sendBroadcast.setOnClickListener {
local.sendBroadcast(Intent("android.intent.action.XXXXXXXXXX"))
}
//设置接收器
receiver = DynamicReceiver()
val filter = IntentFilter()
filter.addAction("android.intent.action.XXXXXXXXXX")
//注册接收器
local.registerReceiver(receiver,filter)
}
override fun onDestroy() {
super.onDestroy()
//解绑
local.unregisterReceiver(receiver)
}
inner class DynamicReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//根据接收的广播action,做出反馈
}
}
}
注意:千万别再广播中添加过多的逻辑或者进行一些好时操作,如果onReceiver中运行时间超过一定限制还没有结束的话,就会报错。
最后
至此,我们就将Broadcast简单介绍完了,如有错误或者不恰当之处,欢迎私信我,加以改正!同时期待您的关注,感谢您的阅读,谢谢!