Android四大組件之broadcast廣播使用講解
一、廣播機(jī)制概述
通常情況下在學(xué)校的每個(gè)教室都會(huì)裝有一個(gè)喇叭,這些喇叭是接入到學(xué)校廣播室的。如果有重要通知,會(huì)發(fā)送一條廣播來告知全校師生。為了便于發(fā)送和接收系統(tǒng)級(jí)別的消息通知,Android系統(tǒng)也引入了一套類似廣播的消息機(jī)制。
Android中的廣播(Broadcast)機(jī)制用于進(jìn)程/線程間通信,該機(jī)制使用了觀察者模式,觀察者模式是一種軟件設(shè)計(jì)模式,該模式是基于消息的發(fā)布/訂閱事件模型,該模型中的消息發(fā)布者是廣播機(jī)制中的廣播發(fā)送者,消息訂閱者是廣播機(jī)制中的廣播接收者。

上述圖中的廣播機(jī)制的實(shí)現(xiàn)流程具體如下:
1、廣播接收者是通過Binder機(jī)制在AMS(Activity Manager Service)中進(jìn)行注冊(cè)的 (在8.2小節(jié)會(huì)講解廣播接收者的注冊(cè))。
2、廣播發(fā)送者是通過Binder機(jī)制向AMS發(fā)送廣播。
3、AMS查找符合相應(yīng)條件(IntentFilter/Permission)的廣播接收者 (BroadcastReceiver),將廣播發(fā)送到相應(yīng)的消息循環(huán)隊(duì)列中。
4、執(zhí)行消息循環(huán)時(shí)獲取到此廣播,會(huì)回調(diào)廣播接收者(BroadcastReceiver)中的 onReceive()方法并在該方法中進(jìn)行相關(guān)處理。
二、廣播接收者
Android系統(tǒng)中內(nèi)置了很多廣播,例如手機(jī)開機(jī)完成、電池電量不足時(shí)都會(huì)發(fā)送一條廣播。
為了監(jiān)聽來自系統(tǒng)或者應(yīng)用程序的廣播事件,Android系統(tǒng)提供了BroadcastReceiver(廣播接收者)組件。 當(dāng)Android系統(tǒng)產(chǎn)生一個(gè)廣播事件時(shí),可以有多個(gè)對(duì)應(yīng)的廣播接收者接收并進(jìn)行處理。
1、廣播接收者的創(chuàng)建
1、通過在應(yīng)用程序的包中創(chuàng)建一個(gè)類繼承BroadcastReceiver并重寫onReceive()方法來實(shí)現(xiàn)
2、通過選中應(yīng)用程序中的包,右擊選擇【New】→【Other】→【Broadcast Receiver】選項(xiàng)來創(chuàng)建
public class MyBroadcast extends BroadcastReceiver {
@Override
// 當(dāng)廣播接收者接收廣播成功,此方法會(huì)自動(dòng)回調(diào)執(zhí)行,在該方法中實(shí)現(xiàn)廣播接收者的相關(guān)操作
public void onReceive(Context context, Intent intent) {
}
}注意:創(chuàng)建完廣播接收者之后還需要對(duì)廣播接收者進(jìn)行注冊(cè)才可以接收廣播。
2、廣播接收者的注冊(cè)
(1)靜態(tài)注冊(cè)
AndroidManifest.xml清單文件中
<receiver android:name=".utils.MyBroadcast" android:enabled="true" android:exported="true"> <intent-filter> <action>cn.com.hello</action> </intent-filter> </receiver>
注意:靜態(tài)注冊(cè)廣播,在小于Android8.0的設(shè)備上,只要設(shè)備處于開啟狀態(tài),廣播接收者就能接收到廣播。Android8.0之后不支持靜態(tài)注冊(cè)方式。
(1)動(dòng)態(tài)注冊(cè)
<receiver android:name=".utils.MyBroadcast" android:enabled="true" android:exported="true"> </receiver>
public class BroadcastReceiverActivity extends AppCompatActivity {
private MyBroadcast myBroadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_receiver);
// 創(chuàng)建廣播接收者對(duì)象
myBroadcast = new MyBroadcast();
String action = "cn.com.hello"
// 創(chuàng)建意圖過濾器
IntentFilter intentFilter = new IntentFilter();
// 設(shè)置要過濾的廣播
intentFilter.addAction(action );
// 注冊(cè)廣播接收者
registerReceiver(myBroadcast,intentFilter);
}
// 廣播接收者是稀缺資源,使用結(jié)束要注銷,可以在app銷毀的階段進(jìn)行注銷
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myBroadcast);
}
}注意:動(dòng)態(tài)注冊(cè)的廣播接收者是否被注銷依賴于注冊(cè)廣播的組件,當(dāng)組件銷毀時(shí),廣播接收者也隨之被注銷。
三、廣播的類型
1、無序廣播
無序廣播是完全異步執(zhí)行,發(fā)送廣播時(shí)所有監(jiān)聽這個(gè)廣播的廣播接收者都會(huì)接收到此消息,但接收的順序不確定。
發(fā)送廣播:
btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 發(fā)送一次廣播
Intent intent = new Intent();
intent.putExtra("info","hello,who are you ?");
// 設(shè)置廣播的action,相當(dāng)于廣播的名稱
String action = "cn.com.hello"
intent.setAction(action);
// 發(fā)送廣播,廣播會(huì)發(fā)送到信息中心,由信息中心負(fù)責(zé)找到這個(gè)廣播的訂閱者并將廣播的意圖傳過去
// 無序廣播
sendBroadcast(intent);
}
});
接收廣播:
(1)MyBroadcast工具類文件:
public class MyBroadcast extends BroadcastReceiver {
@Override
// 當(dāng)廣播接收者接收廣播成功,此方法會(huì)自動(dòng)回調(diào)執(zhí)行
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("info");
Log.v("msg","接收到了廣播信息!");
}
}
(2)Activity文件
myBroadcast = new MyBroadcast(); String action = "cn.com.hello" IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(action); registerReceiver(myBroadcast,intentFilter);
2、有序廣播
按照接收者的優(yōu)先級(jí)接收,只有一個(gè)廣播接收者能接收消息,在此廣播接收者中邏輯執(zhí)行完畢后,才會(huì)繼續(xù)傳遞。
發(fā)送廣播:
Intent intent = new Intent();
intent.putExtra("info","hello,who are you ?");
String action = "cn.com.hello"
intent.setAction(action);
// 有序廣播
sendOrderedBroadcast(intent,null);
接收廣播:
(1)MyBroadcast工具類文件:
public class MyBroadcast extends BroadcastReceiver {
@Override
// 當(dāng)廣播接收者接收廣播成功,此方法會(huì)自動(dòng)回調(diào)執(zhí)行
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("info");
Log.v("msg","接收到了廣播信息!");
// 截?cái)鄰V播的發(fā)送,之后的廣播接收者就接收不到廣播了
abortBroadcast();
}
}
(2)Activity文件
myBroadcast = new MyBroadcast(); String action = "cn.com.hello" IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(action); // 設(shè)置優(yōu)先級(jí) intentFilter.setPriority(8); // 注冊(cè)廣播接收者 registerReceiver(myBroadcast,intentFilter);
注意:數(shù)值越大,優(yōu)先級(jí)越高。如果兩個(gè)廣播接收者的優(yōu)先級(jí)相同,則先注冊(cè)的廣播接收者優(yōu)先級(jí)高。
到此這篇關(guān)于Android四大組件之broadcast廣播使用講解的文章就介紹到這了,更多相關(guān)Android broadcast內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android客戶端實(shí)現(xiàn)注冊(cè)、登錄詳解(1)
這篇文章主要為大家詳細(xì)介紹了Android客戶端實(shí)現(xiàn)注冊(cè)、登錄代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android開發(fā)實(shí)現(xiàn)圖片切換APP
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)圖片切換APP,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
android實(shí)現(xiàn)添加耳機(jī)狀態(tài)圖標(biāo)的方法
這篇文章主要介紹了android實(shí)現(xiàn)添加耳機(jī)狀態(tài)圖標(biāo)的方法,較為詳細(xì)的分析了Android實(shí)現(xiàn)添加耳機(jī)圖標(biāo)的原理與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android入門之Style與Theme用法實(shí)例解析
這篇文章主要介紹了Android入門之Style與Theme用法,非常實(shí)用的功能,需要的朋友可以參考下2014-08-08
解析Android開發(fā)優(yōu)化之:對(duì)界面UI的優(yōu)化詳解(二)
在一個(gè)應(yīng)用程序中,一般都會(huì)存在多個(gè)Activity,每個(gè)Activity對(duì)應(yīng)著一個(gè)UI布局文件。一般來說,為了保持不同窗口之間的風(fēng)格統(tǒng)一,在這些UI布局文件中,幾乎肯定會(huì)用到很多相同的布局2013-05-05
Android 自定義通用的loadingview實(shí)現(xiàn)代碼
本篇文章主要介紹了Android 自定義通用的loadingview實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01
Android MQTT與WebSocket協(xié)議詳細(xì)講解
MQTT(消息隊(duì)列遙測(cè)傳輸)是ISO 標(biāo)準(zhǔn)(ISO/IEC PRF 20922)下基于發(fā)布/訂閱范式的消息協(xié)議。它工作在TCP/IP協(xié)議族上,是為硬件性能低下的遠(yuǎn)程設(shè)備以及網(wǎng)絡(luò)狀況糟糕的情況下而設(shè)計(jì)的發(fā)布/訂閱型消息協(xié)議2022-11-11
Android中Json數(shù)據(jù)讀取與創(chuàng)建的方法
android 讀取json數(shù)據(jù),下面小編給大家整理有關(guān)Android中Json數(shù)據(jù)讀取與創(chuàng)建的方法,需要的朋友可以參考下2015-08-08
分享安裝Android Studio3.6的經(jīng)驗(yàn)教訓(xùn)
這篇文章主要介紹了Android Studio3.6的安裝錯(cuò)誤問題及解決方法,非常值得大家參考,現(xiàn)把整個(gè)過程分享到腳本之家平臺(tái),需要的朋友參考下吧2020-02-02

