轉載請註明出處:http://blog.csdn.net/zhouli_csdn/article/details/45645743
廣播是一種廣泛運用的在應用程序之間傳輸信息的機制 。而 BroadcastReceiver 是對發送出來的廣播進行過濾接收並響應的一類組件;BroadcastReceiver 自身並不實現圖形用戶界面,但是當它收到某個通知後, BroadcastReceiver 可以啓動Activity 作爲響應,或者通過 NotificationMananger 提醒用戶,或者啓動 Service 等等。
broadcastReceiver屬性:
android:enabled="true",只有application和自身的這兩個屬性都爲true,纔可以被實例化。
android:exported="true",默認值依據是否有intent filters,有就爲true,沒有爲false。
android:permissino,使用name屬性指定權限
權限在manifesst中使用permission聲明。例如:(權限聲明部分摘錄自:http://berdy.iteye.com/blog/1782854)
- <permission android:description="string resource"
- android:icon="drawable resource"
- android:label="string resource"
- android:name="string"
- android:permissionGroup="string"
- android:protectionLevel=["normal" | "dangerous" |
- "signature" | "signatureOrSystem"] />
android:label: 對權限的一個簡短描述
android:name :權限的唯一標識,一般都是使用 報名加權限名
android:permissionGroup: 權限所屬權限組的名稱
android:protectionLevel: 權限的等級,
normal 是最低的等級,聲明次權限的app,系統會默認授予次權限,不會提示用戶
dangerous 權限對應的操作有安全風險,系統在安裝聲明此類權限的app時會提示用戶
signature 權限表明的操作只針對使用同一個證書籤名的app開放
signatureOrSystem 與signature類似,只是增加了rom中自帶的app的聲明
android:name 屬性是必須的,其他的可選,未寫的系統會指定默認值
兩種註冊方法:
系統註冊:
< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "1000" >
< action android:name = " android.provider.Telephony.SMS_RECEIVED" />
</ intent-filter >
</ receiver >
代碼註冊:
IntentFilter filterB = new IntentFilter();
filterB.addAction("sendMyBroadcastReceiverB");
MyBroadcastReceiverB myBroadcastReceiverB = new MyBroadcastReceiverB();
this.registerReceiver(myBroadcastReceiverB, filterB);
andorid broadcast類型:
sendBroadcast:發送普通廣播,廣播發送後所有接收者以不同的順序運行,通常在同一時刻。
在有些情況下,例如那些需要創建一個進程的廣播,只有一個會被執行避免系統因爲創建進程負載。
sendOrderedBroadcast:一次只有一個廣播在執行,可以給下一個廣播提供一個結果或者終止廣播繼續傳遞。可以通過android:priority控制廣播的順序,相同優先級的廣播的執行順序不確定。
sendStickyBroadcast:粘性廣播,發出後系統會保留最後一次發送的intnet,在有廣播註冊後可以立即收到廣播,且會一直存在。(退出發送廣播的應用也會存在)
1):相同的intent,系統只會保留最後一次
2):不同的intent,可以一起存在。
安全:
1)確保intent actions和其它的條件是唯一的,否則會衝突
2)使用registerReceiver(BroadcastReceiver,
IntentFilter),任何其它應用都可以給它發送廣播
3)當你在manifest中註冊廣播,其它任何應用都可以給它發送廣播,使用android:exported="false"阻止。
4)
sendBroadcast(Intent),任何其它應用都可以收到廣播,可以通過權限控制。從
ICE_CREAM_SANDWICH開始,可以設置
Intent.setPackage發給一個應用。
使用LocalBroadcastManager不會發生上述問題,因爲他不會將intent廣播出當前進程
可以使用
sendBroadcast(Intent,
String)或者
sendOrderedBroadcast(Intent,
String, BroadcastReceiver, android.os.Handler, int, String, Bundle)指定權限,只有那麼在manifest中註冊了permission的receiver可以收到廣播。
廣播生命週期:
一個正在執行廣播的onRecieve的方法的進程會被認爲是前臺進程。一旦從onReveieve返回,就和其他運行在進程中的組件優先級相同。
onReceieve方法:
通常運行在UI線程,除非指定
registerReceiver(BroadcastReceiver,
IntentFilter, String, android.os.Handler)是它運行在其它線程。當廣播運行在主線程的時候,不能在onReceieve方法執行超過10s的操作。也不能在裏面彈出對話框。
應用場景暫略。