一蹄咖,什么是廣播?
廣播付鹿, 做為Android的四大組件之一澜汤,被用于發(fā)送和接收舵匾,來(lái)自系統(tǒng)或其它app的消息。其設(shè)計(jì)原理徽诲,是基于觀察者模式來(lái)設(shè)計(jì)的吵血,即先訂閱,后接收蹋辅。廣播消息,并不受限于某一個(gè)單一進(jìn)程侦另。因此,它可以用于跨進(jìn)程間的通信淋肾,在多個(gè)App之間傳遞消息。
二拿愧,廣播的分類碌尔。
根據(jù)廣播的訂閱(定義)方式和生命周期,我們可以將廣播歸納為2種類型唾戚,即靜態(tài)廣播與動(dòng)態(tài)廣播。
- 靜態(tài)廣播
靜態(tài)注冊(cè)的廣播熊镣,在App被安裝后,就自動(dòng)被系統(tǒng)的PackageManager注冊(cè)保存起來(lái)绪囱。這樣,哪怕你的app鬼吵,沒有在運(yùn)行,你的app也可以接收到廣播齿椅。訂閱這樣一個(gè)廣播,我們需要分2步實(shí)現(xiàn)示辈。第1步涩澡,是創(chuàng)建一個(gè)類坠敷,繼承自BroadcastReceiver。第2步膝迎,是在配置清單文件(AndroidManifest.xml)里面,進(jìn)行配置第1步所創(chuàng)建的類限次。
- 創(chuàng)建繼承自BroadcastReceiver的類,代碼如下:
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// 當(dāng)接收到廣播時(shí)费尽,這個(gè)方法會(huì)被調(diào)用羊始,intent參數(shù),包含了廣播所附帶的數(shù)據(jù)突委。
}
}
- 在AndroidManifest.xml里面,配置剛剛定義的類缘缚。這個(gè)<receiver></receiver>標(biāo)簽敌蚜,必須放在<application></application>標(biāo)簽中間,與<activity/>標(biāo)簽同層級(jí)。
<receiver android:name=".MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
</intent-filter>
</receiver>
- 動(dòng)態(tài)廣播
動(dòng)態(tài)廣播酸舍,是指通過(guò)代碼里初,來(lái)動(dòng)態(tài)訂閱。每一個(gè)動(dòng)態(tài)廣播淮阐,都綁定一個(gè)上下文Context刁品,要么是某個(gè)Activity的泣特,要么是Application的挑随。它的特點(diǎn)是,生命周期只局限于某個(gè)頁(yè)面的生命周期膏孟,亦或是App的生命周期拌汇。當(dāng)綁定廣播的Activity或App被銷毀后,就無(wú)法再接收廣播噪舀。同樣地,訂閱這樣一個(gè)廣播界逛,我們需要分2步走纺座。第1步,是創(chuàng)建一個(gè)類比驻,繼承自BroadcastReceiver,熟悉的配方狈茉,一樣的方式掸掸。第2步蹭秋,創(chuàng)建該類的實(shí)例。
- 創(chuàng)建繼承自BroadcastReceiver的類仁讨,代碼如下:
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// 當(dāng)接收到廣播時(shí)实昨,這個(gè)方法會(huì)被調(diào)用,intent參數(shù)丈挟,包含了廣播所附帶的數(shù)據(jù)志电。
}
}
- 創(chuàng)建BroadcastReceiver子類的實(shí)例,代碼如下:
val br: BroadcastReceiver = MyBroadcastReceiver()
- 創(chuàng)建IntentFilter挑辆,添加訂閱事件,并注冊(cè)廣播洒嗤。
val filter = IntentFilter()
// 添加要訂閱的廣播事件
filter.addAction(Intent.ACTION_SCREEN_OFF)
// 注冊(cè)廣播
registerReceiver(br, filter)