Day 25 | BroadcastReceiver 广播

BroadcastReceiver(广播接收器)是应用程序元件之一,类似於订阅与发布的设计模式,分为Broadcaster(广播器)与Receiver(接收器),广波器可发送自定义或系统预设的广播事件,让接收器取得讯息,而接受器则注册特定的频道,等待广播器发送讯息并执行对应的处理。

Listener与BroadcastReceiver的差异

https://ithelp.ithome.com.tw/upload/images/20210925/20140878eTu3qtQ7kj.jpg

建立BroadcastReceiver

  1. File→New→Other→Broadcast Receiver

    Untitled

  2. 修改Receiver名称後点选Finish

    Untitled

  3. AS会自动产生BroadcastReceiver需要的档案,AndroidManifest.xml也会自动增加Receiver的资讯

    Untitled

在Activity中建立BroadcastReceiver物件,就不必在AndroidManifest.xml新增Receiver标签

private val receiver: BroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            intent.extras?.let { 
                //...下略
            }
        }
    }

注册与接收BroadcastReceiver

//注册
registerReceiver(receiver, IntentFilter("MyBroadcast"))

//注销
unregisterReceiver(receiver)

Receiver注册时,需使用IntentFilter类别定义要接收的事件,而Broadcaster在发送前,也必须定义事件的「识别标签」,识别标签会决定要接收的事件类型,而广播事件的类型分为系统预设与自行定义。

系统预设事件

  • ACTION_BATTERY_LOW:低电量通知
  • ACTION_HEADSET_PLUG:耳机插入或拔除
  • ACTION_SCREEN_ON:萤幕开启
  • ACTION_TIMEZONE_CHANGED:时区改变
class MainActivity : AppCompatActivity() {
    //实作当萤幕开启时显示萤幕开启的Toast
    //Step1:建立BroadcastReceiver物件
    private val receiver = object : BroadcastReceiver() {
        //Step2:在onReceive()中加入接收广播後要执行的动作
        override fun onReceive(context: Context, intent: Intent) {
            //用Toast显示通知讯息
            Toast.makeText(context, "萤幕开启", Toast.LENGTH_SHORT).show()
        }
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //Step3:建立IntentFilter物件,并指定接收的识别标签为萤幕开启
        val intentFilter = IntentFilter(Intent.ACTION_SCREEN_ON)
        //Step4:注册Receiver
        registerReceiver(receiver,intentFilter)
    }
}

自定义事件

class MainActivity : AppCompatActivity() {
    //Step1:建立BroadcastReceiver物件
    private val receiver = object : BroadcastReceiver() {
        //Step2:在onReceive()中加入接收广播後要执行的动作
        override fun onReceive(context: Context, intent: Intent) {
            intent.extras?.let {
                //解析intent取得字串讯息
                val msg = "资料:${it.getString("msg")}"
                Toast.makeText(context, "萤幕开启", Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //Step3:建立IntentFilter物件,并指定接收的识别标签为MyBroadcast
        val intentFilter = IntentFilter("MyBroadcast")
        //Step4:注册Receiver
        registerReceiver(receiver,intentFilter)
    }
}

由於是自定义的事件,因此需要应用程序执行sendBroadcast(),来发送广播让Receiver接收。通常会撰写在其他程序区块

//建立带有识别标签的Intent
val intent = Intent("MyBroadcast")
//发送自定义的广播事件
sendBroadcast(intent.putExtra("msg","data")

<<:  Day13 - 使用爬虫套件撷取网页内容

>>:  谈谈SQLite

【Day 27】差点被我遗忘的 x AWS RDS on Outpost x 云端资料库储存

tags: 铁人赛 AWS RDS Outposts database 前情提要 差点就跟蔡琴一样,...

冒险村06 - Auto-update dependencies

06 - Auto-update dependencies 除了 Release Drafter 及...

【没钱买ps,PyQt自己写】Day 2 - 利用 Qt designer 建立第一支有自己介面的 PyQt5 程序

看完这篇文章你会得到的成果图 这次是我初学 PyQt5 的一些笔记, 每天都学一点点,至於整理的部分...

Day30:【技术篇】架设网站的基本知识

一、前言   昨天发文後,马上收到系统罐头通知,终於熬到这一天了(我好兴奋啊啊啊!)终於要完成人生首...

【LeetCode】Binary Search Tree

突然发现前面应该要多写一点的@@ 我本来没打算花那麽多篇幅讲 Leetcode... 铁人赛有几篇写...