Broadcast初识 | 青训营笔记

190 阅读4分钟

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简单介绍完了,如有错误或者不恰当之处,欢迎私信我,加以改正!同时期待您的关注,感谢您的阅读,谢谢!

参考

广播概述|安卓开发者

Broadcast Receiver - 掘金 (juejin.cn)