您好,登錄后才能下訂單哦!
BroadcastReceiver:廣播接收器,是一個(gè)專注于接收廣播通知信息,并做出對(duì)應(yīng)處理的組件
1、應(yīng)用程序可以擁有任意數(shù)量的廣播接收器以對(duì)所有它感興趣的通知信息予以響應(yīng)。所有的接收器均繼承自BroadcastReceiver基類
2、廣播接收器沒(méi)有用戶界面。然而,它們可以啟動(dòng)一個(gè)activity來(lái)響應(yīng)它們收到的信息,或者用NotificationManager來(lái)通知用戶。通知可以用很多種方式來(lái)吸引用戶的注意力──閃動(dòng)背燈、震動(dòng)、播放聲音等等。一般來(lái)說(shuō)是在狀態(tài)欄上放一個(gè)持久的圖標(biāo),用戶可以打開它并獲取消息
3、 Android中的廣播事件有兩種:
1)系統(tǒng)廣播事件,比如:ACTION_BOOT_COMPLETED(系統(tǒng)啟動(dòng)完成后觸發(fā)),ACTION_TIME_CHANGED(系統(tǒng)時(shí)間改變時(shí)觸發(fā)),ACTION_BATTERY_LOW(電量低時(shí)觸發(fā))等等2)我們自定義的廣播事件。
4、 廣播時(shí)間流程:
1)注冊(cè)廣播事件:注冊(cè)方式有兩種,
一種是靜態(tài)注冊(cè),就是在AndroidManifest.xml文件中定義,注冊(cè)的廣播接收器必須要繼承BroadcastReceiver;靜態(tài)注冊(cè)的廣播,在程序結(jié)束時(shí),仍會(huì)監(jiān)聽符合的action
另一種是動(dòng)態(tài)注冊(cè),是在程序中使用Context.registerReceiver注冊(cè),注冊(cè)的廣播接收器相當(dāng)于一個(gè)匿名類。兩種方式都需要IntentFIlter。
2)發(fā)送廣播事件:通過(guò)Context.sendBroadcast來(lái)發(fā)送,由Intent來(lái)傳遞注冊(cè)時(shí)用到的Action。
3)接收廣播事件:當(dāng)發(fā)送的廣播被接收器監(jiān)聽到后,會(huì)調(diào)用它的onReceive()方法,并將包含消息的Intent對(duì)象傳給它。
注意:onReceive中代碼的執(zhí)行時(shí)間不要超過(guò)5s,否則Android會(huì)彈出超時(shí)dialog。
5、廣播的生命周期
一個(gè)BroadcastReceiver 對(duì)象只有在被調(diào)用onReceive(Context, Intent)的才有效的,
當(dāng)從該函數(shù)返回后,該對(duì)象就無(wú)效的了,結(jié)束生命周期
下面通過(guò)代碼來(lái)實(shí)現(xiàn)廣播的注冊(cè)與發(fā)送、接收廣播
首先定義一個(gè)廣播接收器,創(chuàng)建一個(gè)類(MyReceiver)繼承BroadcastReceiver,實(shí)現(xiàn)其onReceive()方法
package com.BroadcastReceive.Archer; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("com.action.text")) { String msg = intent.getStringExtra("msg"); Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } } }
一個(gè)廣播接收器可以接收來(lái)自四面八方發(fā)出的消息,所以可以在onReceive中通過(guò)intent.getAction判斷接收到的action來(lái)進(jìn)行不同的操作,action為系統(tǒng)的action或者我們自定義的action
然后需要注冊(cè)廣播了,有兩種注冊(cè)方式
靜態(tài)注冊(cè):
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 靜態(tài)注冊(cè)廣播 --> <receiver android:name=".MyReceiver" > <intent-filter> <action android:name="com.action.text" /> //自定義的action,為一個(gè)字符串 </intent-filter> </receiver> </application>
動(dòng)態(tài)注冊(cè):
private MyReceiver receiver = new MyReceiver(); //實(shí)例化廣播接收器
//動(dòng)態(tài)注冊(cè)廣播 IntentFilter filter = new IntentFilter(); filter.addAction("com.action.text"); registerReceiver(receiver, filter);
在Activity或Service中注冊(cè)了一個(gè)BroadcastReceiver(動(dòng)態(tài)注冊(cè)),
當(dāng)這個(gè)Activity或Service被銷毀時(shí)如果沒(méi)有解除注冊(cè),系統(tǒng)會(huì)報(bào)一個(gè)異常
我們可以在onStop()或者onDestroy()中進(jìn)行解除注冊(cè)
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); }
發(fā)送廣播
Intent intent = new Intent(); intent.setAction("com.action.text");//為廣播時(shí)間設(shè)置action intent.putExtra("msg", "接收廣播成功"); sendBroadcast(intent);
如果我們需要在發(fā)送廣播的同時(shí),進(jìn)行數(shù)據(jù)傳遞,可以通過(guò)intent來(lái)傳遞
無(wú)序廣播:
當(dāng)發(fā)出廣播時(shí),所有有注冊(cè)這個(gè)action的廣播接收器均會(huì)接收到這個(gè)廣播事件,且執(zhí)行無(wú)先后順序,相互之間不會(huì)有影響;沒(méi)有注冊(cè)則不會(huì)接收到
有序廣播
當(dāng)有多一個(gè)廣播接收器注冊(cè)這個(gè)action,且我們需要給他們?cè)O(shè)置接收的順序時(shí),這時(shí)候就要用到有序廣播。
有序廣播比較特殊,它每次只發(fā)送到優(yōu)先級(jí)較高的接收器那里,然后由優(yōu)先級(jí)高的接收器再傳播到優(yōu)先級(jí)低的接收器那里,優(yōu)先級(jí)高的接收者有能力終止這個(gè)廣播。
先定義兩個(gè)廣播接收器,F(xiàn)irstReceiver為優(yōu)先級(jí)較高的接收器
public class FirstReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("action")) { String msg = intent.getStringExtra("msg"); Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); Bundle bundle = new Bundle(); bundle.putString("msg", "來(lái)自第一個(gè)廣播接收器的消息"); setResultExtras(bundle); //將一個(gè)Bundle對(duì)象設(shè)置為結(jié)果集對(duì)象,傳遞到下一個(gè)接收者那里 } } }
public class SecondReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("action")) { String msg = getResultExtras(true).getString("msg"); //用getResultExtras獲取到經(jīng)過(guò)處理的信息 Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } } }
注冊(cè)廣播時(shí),需要給設(shè)置優(yōu)先級(jí) android:priority
<receiver android:name=".FirstReceiver"> <intent-filter android:priority="1000"> //這個(gè)屬性的范圍在-1000到1000,數(shù)值越大,優(yōu)先級(jí)越高 <action android:name="com.action.text"/> </intent-filter> </receiver>
<receiver android:name=".FirstReceiver"> <intent-filter android:priority="1000"> //這個(gè)屬性的范圍在-1000到1000,數(shù)值越大,優(yōu)先級(jí)越高 <action android:name="com.action.text"/> </intent-filter> </receiver>
<receiver android:name=".SecondReceiver"> <intent-filter android:priority="999"> <action android:name="com.action.text"/> </intent-filter> </receiver>
發(fā)送有序廣播
Intent intent = new Intent(); intent.setAction("com.action.text"); intent.putExtra("msg", "來(lái)自Activity的消息"); sendOrderedBroadcast(intent, "scott.permission.MYBROADCAST");
使用發(fā)送有序廣播,第二個(gè)參數(shù)為自定義權(quán)限,為null時(shí),表示不需要聲明指定權(quán)限;不為空,表示需要聲明指定權(quán)限,聲明如下權(quán)限 <permission android:protectionLevel="normal" android:name="scott.permission.MYBROADCAST" /> <uses-permission android:name="scott.permission.MYBROADCAST" />
這有發(fā)出廣播時(shí),優(yōu)先級(jí)最高的接收器就會(huì)先接收到廣播,然后再依次傳遞給優(yōu)先級(jí)較低的接收器
如果我們需要在某一個(gè)接收器中終止廣播,可以在onReceiver()中調(diào)用如下代碼
abortBroadcast();
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。