android broadcast

轉載請註明出處: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)

  1. <permission android:description="string resource"  
  2.             android:icon="drawable resource"  
  3.             android:label="string resource"  
  4.             android:name="string"  
  5.             android:permissionGroup="string"  
  6.             android:protectionLevel=["normal" | "dangerous" |   
  7.                                      "signature" | "signatureOrSystem"] />
android:description :對權限的描述,一般是兩句話,第一句話描述這個權限所針對的操作,第二句話告訴用戶授予app這個權限會帶來的後果 
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的操作。也不能在裏面彈出對話框。


應用場景暫略。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章