《第一行代碼》閱讀筆記 (3)

一、廣播機(jī)制

Android中的每個(gè)應(yīng)用程序都可以對(duì)自己感興趣的廣播進(jìn)行注冊(cè), 這樣該程序就只會(huì)接收到自己所關(guān)心的廣播內(nèi)容, 這些廣播可能是來(lái)自于系統(tǒng)的, 也可能是來(lái)自于其他應(yīng)用程序的。

廣播的發(fā)送與接收、標(biāo)準(zhǔn)廣播和有序廣播的概念

接收系統(tǒng)廣播

廣播接收器可以自由地對(duì)自己感興趣的廣播進(jìn)行注冊(cè), 這樣當(dāng)有相應(yīng)的廣播發(fā)出時(shí), 廣播接收器就能夠收到該廣播, 并在內(nèi)部處理相應(yīng)的邏輯。 注冊(cè)廣播的方式一般有兩種, 在代碼中注冊(cè)和在AndroidManifest.xml中注冊(cè), 其中前者也被稱為動(dòng)態(tài)注冊(cè), 后者也被稱為靜態(tài)注冊(cè)。

動(dòng)態(tài)注冊(cè):

當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí),系統(tǒng)發(fā)出的是一條值為android.net.conn.CONNECTIVITY_CHANGE的廣播,動(dòng)態(tài)注冊(cè)的廣播接收器一定都要取消注冊(cè)才行。

@Override

protected void onCreate(Bundle savedInstanceState) {

??? super.onCreate(savedInstanceState);

??? setContentView(R.layout.activity_main);

??? intentFilter = new IntentFilter();

??? intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

??? networkChangeReceiver = new NetworkChangeReceiver();

??? registerReceiver(networkChangeReceiver, intentFilter);

}

@Override

protected void onDestroy() {

??? super.onDestroy();

??? unregisterReceiver(networkChangeReceiver);

}

Android系統(tǒng)為了保證應(yīng)用程序的安全性做了規(guī)定, 如果程序需要訪問(wèn)一些系統(tǒng)的關(guān)鍵性信息, 必須在配置文件中聲明權(quán)限才可以, 否則程序?qū)?huì)直接崩潰, 比如這里查詢系統(tǒng)的網(wǎng)絡(luò)狀態(tài)就是 需要聲明權(quán)限的 。 打開(kāi)AndroidManifest.xml文件,在里面加入如下權(quán)限就可以查詢系統(tǒng)網(wǎng)絡(luò)狀態(tài)了:

靜態(tài)注冊(cè):

可以讓程序在未啟動(dòng)的情況下就能接收到廣播,需要在AndroidManifest.xml中將廣播接收器的類名注冊(cè)進(jìn)去。

不要在onReceive()方法中添加過(guò)多的邏輯或者進(jìn)行任何的耗時(shí)操作, 因?yàn)樵趶V播接收器中是不允許開(kāi)啟線程的, 當(dāng)onReceive()方法運(yùn)行了較長(zhǎng)時(shí)間而沒(méi)有結(jié)束時(shí), 程序就會(huì)報(bào)錯(cuò)。因此廣播接收器更多的是扮演一種打開(kāi)程序其他組件的角色, 比如創(chuàng)建一條狀態(tài)欄通知, 或者啟動(dòng)一個(gè)服務(wù)等。

發(fā)送自定義廣播

1.發(fā)送標(biāo)準(zhǔn)廣播

Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");

sendBroadcast(intent);

2.發(fā)送有序廣播

Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");

sendOrderedBroadcast(intent, null);

通過(guò)abortBroadcast()方法中止廣播。

發(fā)送本地廣播

發(fā)送:

localBroadcastManager = LocalBroadcastManager.getInstance(this);

Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");

localBroadcastManager.sendBroadcast(intent);

注冊(cè)本地廣播接收器:

intentFilter = new IntentFilter();

intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");

localReceiver = new LocalReceiver();

localBroadcastManager.registerReceiver(localReceiver, intentFilter);

本地廣播是無(wú)法通過(guò)靜態(tài)注冊(cè)的方式來(lái)接收的。使用本地廣播的幾點(diǎn)優(yōu)勢(shì):

1.可以明確地知道正在發(fā)送的廣播不會(huì)離開(kāi)我們的程序, 因此不需要擔(dān)心機(jī)密數(shù)據(jù)泄漏的問(wèn)題。

2.其他的程序無(wú)法將廣播發(fā)送到我們程序的內(nèi)部, 因此不需要擔(dān)心會(huì)有安全漏洞的隱患。

3.發(fā)送本地廣播比起發(fā)送系統(tǒng)全局廣播將會(huì)更加高效。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容