iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0
自我挑戰組

社畜轉行之旅,30天Kotlin學習筆記系列 第 25

Day 25 | BroadcastReceiver 廣播

  • 分享至 

  • xImage
  •  

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")

上一篇
Day 24 | Service
下一篇
Day 26 | SQLite資料庫(一)
系列文
社畜轉行之旅,30天Kotlin學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言