97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

當前位置: 移動互聯(lián)網(wǎng)學院 > Android開發(fā) > 廣播接收者BroadcastReceiver
廣播接收者BroadcastReceiver 時間:2017-10-30     來源:移動互聯(lián)網(wǎng)學院

作為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便是能夠加深理解進而掌握該技術,程序員的核心還是在敲代碼,敲得越多,那么跟取得的效果便是正比的。