一、廣播機(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ì)更加高效。