首先問一下什么叫廣播?
其實在學習android廣播機制之前我一直以為廣播就是類似於計算機網絡里面的廣播。如果這么想就打錯特錯了,Android廣播機制指的是,在一個應用程序運行的時候可以自定義一個消息類型,讓相應的接收器去處理這個消息或者是系統消息,比如來電話了、來短信了、手機沒電了等等系統發送的消息。系統發送的消息也可以通過廣播的方式通知給應用程序,這樣子就避免了新開一個Thread去監聽系統或其他應用發送過來的消息的狀態。
Android廣播的分類:
1、 普通廣播:這種廣播可以依次傳遞給各個處理器去處理
2、 有序廣播:這種廣播在處理器端的處理順序是按照處理器的不同優先級來區分的,高優先級的處理器會優先截獲這個消息,並且可以將這個消息刪除
3、 粘性消息:粘性消息在發送后就一直存在於系統的消息容器里面,等待對應的處理器去處理,如果暫時沒有處理器處理這個消息則一直在消息容器里面處於等待狀態。
注意:普通廣播和粘性消息不同被截獲,而有序廣播是可以被截獲的
處理器的注冊:
1、 在代碼中用函數代碼動態的方式注冊。動態注冊的處理器必須用代碼動態的銷毀,每次用來處理消息的就一個實例對象
2、 在配置文件里面靜態注冊,靜態注冊有個特點,那就是一旦注冊就會一直存在於系統里面,無論應用是否關閉或開關機。(簡直就是一個流氓軟件病毒啊~)。靜態注冊每次有處理消息就由系統new一個處理器處理,並銷毀
下面具體看看Android廣播消息的發送、注冊、處理過程:
① 自定義處理器類:
public class MyBroadcastReceiver4 extends BroadcastReceiver {
public MyBroadcastReceiver4() {
System.out.println("創建了一個由registerReceiver()注冊的廣播接收器");
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
System.out.println("MyBroadcastReceiver4收到了一個" + action + "消息");
if (isOrderedBroadcast()) {
System.out.println("這是一個有序廣播,已經被攔截了。");
this.abortBroadcast();
} else {
System.out.println("這不是一個有序廣播");
}
Bundle bundle = intent.getExtras();
if (bundle != null) {
System.out.println("該消息攜帶的數據如下:");
// 獲得bundle的一個key的集合
Set set = bundle.keySet();
// 獲得上述集合的迭代器
Iterator iterator = set.iterator();
// 用迭代器遍歷集合
while (iterator.hasNext()) {
// 取得集合中的一個內容
String str = (String) iterator.next();
// 取得Bundle中的內容
System.out.println(str + "--->" + bundle.get(str));
}
} else {
System.out.println("該消息沒有攜帶數據");
}
Toast toast = Toast.makeText(context, "MyBroadcastReceiver4收到了一個"
+ action + "消息", Toast.LENGTH_LONG);
toast.show();
//將這個消息截獲(從消息容器移除)這樣其他處理器就沒法接收到這個消息
this.abortBroadcast();
}
}
② 發送廣播消息
⑴、 發送普通廣播:
// 發送一個普通消息
Intent intent = new Intent(); intent.setAction("asdfasdf");
Android_09_10Activity.this.sendBroadcast(intent);
⑵、 發送有序廣播:
// 發送一個有序消息
Intent intent = new Intent();
intent.setAction("asdfasdf"); Android_09_10Activity.this.sendOrderedBroadcast(intent,
null);
⑶、 發送粘性廣播:
// 發送一個粘性消息
Intent intent = new Intent();
intent.setAction("qwerqwer"); Android_09_10Activity.this.sendStickyBroadcast(intent);
③ 注冊廣播接收器
⑴動態注冊:
// 注冊一個廣播接收器
IntentFilter intentFilter = new IntentFilter("asdfasdf");
intentFilter.setPriority(0);
Android_09_10Activity.this.registerReceiver(mbr2,
intentFilter);
⑵靜態注冊:
<receiver android:name=".MyBroadcastReceiver4" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.WALLPAPER_CHANGED" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
//這一句比較特殊,是上面那個廣播消息特有的
<data android:scheme="package" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
想發送粘性消息的時候必須在配置文件里面獲取權限:
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
想用自定義處理器對系統廣播進行處理的話也必須在注冊文件里面申明獲取權限,比如:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
