作為Android的四大組件之一,相比對Android有所了解的程序員都會需要掌握這項技術,那么下面我們就展開對廣播接收者BroadcastReceiver給大家做詳細的介紹,看完后相信你就能夠豁然開朗,具體如下:
關于廣播的介紹以及創(chuàng)建
android中broadcast(廣播)和broadcastReceiver(廣播接收者)是成對存在的。broadcast在android系統(tǒng)中體現(xiàn)在很多方面,如當開機完成后系統(tǒng)會產(chǎn)生一條廣播,接收到這條廣播就能實現(xiàn)開機啟動服務的功能;當網(wǎng)絡狀態(tài)改變時系統(tǒng)會產(chǎn)生一條廣播,接收到這條廣播就能及時地做出提示和保存數(shù)據(jù)等操作;當電池電量改變時,系統(tǒng)會產(chǎn)生一條廣播,接收到這條廣播就能在電量低時告知用戶及時保存進度,等等。要創(chuàng)建自己的BroadcastReceiver對象,我們需要繼承android.content.BroadcastReceiver,并實現(xiàn)其onReceive方法。 在onReceive方法內,我們可以獲取隨廣播而來的Intent中的數(shù)據(jù),這非常重要,包含很多有用的信息。
在創(chuàng)建完我們的BroadcastReceiver之后,還不能夠使它進入工作狀態(tài),我們需要為它注冊一個指定的廣播地址。沒有注冊廣播地址的BroadcastReceiver就像一個缺少選臺按鈕的收音機,雖然功能俱備,但也無法收到電臺的信號。
廣播注冊分兩種類型:
①靜態(tài)注冊:
靜態(tài)注冊是在AndroidManifest.xml文件中配置的。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MY_BROADCAST"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
配置了以上信息之后,只要是android.intent.action.MY_BROADCAST這個地址的廣播,MyReceiver都能夠接收的到。注意,這種方式的注冊是常駐型的,也就是說當應用關閉后,如果有廣播信息傳來,MyReceiver也會被系統(tǒng)調用而自動運行,依照這個原理,我們可以使用靜態(tài)注冊,實現(xiàn)系統(tǒng)開機時啟動我們的應用。
②動態(tài)注冊:
動態(tài)注冊需要在代碼中動態(tài)的指定廣播地址并注冊,通常我們是在Activity或Service注冊一個廣播,下面我們就來看一下注冊的代碼:
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_BROADCAST");
registerReceiver(receiver, filter);
*注意,registerReceiver是android.content.ContextWrapper類中的方法,Activity和Service都繼承了ContextWrapper,所以可以直接調用。在實際應用中,我們在Activity或Service中注冊了一個BroadcastReceiver,當這個Activity或Service被銷毀時如果沒有解除注冊,系統(tǒng)會報一個異常,提示我們是否忘記解除注冊了。所以,記得在特定的地方執(zhí)行解除注冊操作:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
*注意,這種注冊方式與靜態(tài)注冊相反,不是常駐型的,也就是說廣播會跟隨程序的生命周期。
我們可以根據(jù)以上任意一種方法完成注冊,當注冊完成之后,這個接收者就可以正常工作了。我們可以用以下方式向其發(fā)送一條廣播:
public void send() {
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "hello receiver.");
sendBroadcast(intent);
}
2*注意,sendBroadcast也是android.content.ContextWrapper類中的方法,它可以將一個指定地址和參數(shù)信息的Intent對象以廣播的形式發(fā)送出去。
上面的例子只是一個接收者來接收廣播,如果有多個接收者都注冊了相同的廣播地址,又會是什么情況呢,能同時接收到同一條廣播嗎,相互之間會不會有干擾呢?這就涉及到普通廣播和有序廣播的概念了。
廣播也可以分為兩種類型:
①普通廣播(Normal Broadcast)
普通廣播對于多個接收者來說是完全異步的,通常每個接收者都無需等待即可以接收到廣播,接收者相互之間不會有影響。對于這種廣播,接收者無法終止廣播,即無法阻止其他接收者的接收動作。
②有序廣播(Ordered Broadcast)
有序廣播比較特殊,它每次只發(fā)送到優(yōu)先級(0 ~ 1000)較高的接收者那里,然后由優(yōu)先級高的接受者再傳播到優(yōu)先級低的接收者那里,優(yōu)先級高的接收者有能力終止這個廣播。
*注意,使用sendOrderedBroadcast方法發(fā)送有序廣播時,需要一個權限參數(shù),如果為null則表示不要求接收者聲明指定的權限,如果不為null,則表示接收者若要接收此廣播,需聲明指定權限。這樣做是從安全角度考慮的
Android四大組件之一的廣播接受者看到這里就表示你對該知識已經(jīng)有了全面的了解,接著只要去嘗試敲一寫demo便是能夠加深理解進而掌握該技術,程序員的核心還是在敲代碼,敲得越多,那么跟取得的效果便是正比的。
熱點新聞