一 、註冊BroadcastReceiver的兩種方法:
1 在AndroidManifest.xml中配置,如:
<receiver android:name="MyReceiver">
<intent-filter>
<actionandroid:name="MyReceiverAction" />
</intent-filter>
</receiver>
在這種方式下,即使註冊廣播接收器的程序關閉,接收器仍然會接收到廣播,除非從模擬器或手機中卸載程序或註銷接收器,否則無法阻止接收器接收廣播。
2 在代碼中指定:
如果想在適當的時候註冊廣播接收器,在使用完後將其註銷,就需要直接使用java代碼來完成這個功能。
MyReceiver receiver = new MyReceiver();//MyReceiver是自己定義的繼承
BroadCastReceive 的類
//IntentFilter filter = new IntentFilter();
//filter.addAction("MyReceiverAction");
IntentFilter filter = new IntentFilter("MyReceiverAction"); registerReceiver(receiver,filter);
這種方式下,即使沒有註銷廣播接收器,當應用程序退出時也會自動註銷。
註銷廣播接收器:
unregisterReceiver(receiver);
二、發送廣播消息:
Intent intent = new Intent();
intent.setAction("MyReceiverAction");
intent.putExtra("msg", "HelloWorld!");
//發送普通廣播
//sendBroadcast(intent);
//放送有序廣播
sendOrderedBroadcast(intent,null);
三、有序廣播
Broadcast(廣播)分爲兩種:
1 Normal Broadcast (普通廣播):NormalBroadcast 是完全異步的,可以在同一個時刻(邏輯上)可以被所有的接收者收到,消息的傳遞效率比較高。缺點是接收者不能將處理結果傳遞給下一個接收者,並且不能阻止BroadcastIntent 的傳播。
2 Ordered Broadcast (有序廣播):OrderedBroadcast 的接收者按照廣播的優先級依次接收廣播,優先級可以在<intent-filter…/>的android:priority屬性中配置,也可以在代碼中調用IntentFilter對象的setPriority()設置,並且數值越大優先級越高。
sendBroadcast()發送普通廣播;
sendOrderedBroadcast()放送有序廣播,廣播接收器按照優先級的高低調用,優先接收到廣播的接收者可以傳遞數據給下一個接收者,也可以調用BroadcastReceiver的abortBroadcast()阻止廣播傳遞給其它接收者。
不管是發送普通廣播還是放送有序廣播,如果設置了優先級,則按照優先級的高低調用接收器,如果不設置優先級或者優先級相同,則對於同一個應用程序中的廣播接收器會按照在AndroidManifest.xml中定義的順序調用。
下面註冊了兩個接收器MyReceiver和Myreceiver1:
<receiver android:name="MyReceiver" >
<intent-filterandroid:priority="10">
<actionandroid:name="MyReceiverAction" />
</intent-filter>
</receiver>
<receiverandroid:name="MyReceiver1" >
<intent-filterandroid:priority="1">
<actionandroid:name="MyReceiverAction" />
</intent-filter>
</receiver>
public class MyReceiver extends BroadcastReceiver{
public MyReceiver(){
System.out.println("MyReceiver");
}
@Override
public void onReceive(Contextcontext, Intent intent) {
System.out.println("onReceive");
Toast.makeText(context,"MyReceiver接收Intent的Action爲:"
+intent.getAction() +"\n消息內容爲:"
+intent.getStringExtra("msg"),Toast.LENGTH_LONG).show();
//創建一個Bundle對象並存入數據
Bundle bundle = new Bundle();
bundle.putString("first","第一個BroadcastReceiver存入的消息");
setResultExtras(bundle);
//取消Broadcast的繼續傳播
//abortBroadcast();
}
}
public class MyReceiver1 extends BroadcastReceiver{
public MyReceiver1(){
System.out.println("MyReceiver1");
}
@Override
public void onReceive(Contextcontext, Intent intent) {
System.out.println("onReceive");
Bundle bundle = getResultExtras(true);
String first =bundle.getString("first");
Toast.makeText(context,"MyReceiver1接收到的Intent的Action爲:"
+intent.getAction() +"\n消息內容爲:"
+intent.getStringExtra("msg") +"\n" + first,Toast.LENGTH_LONG).show();
}
放送廣播:
Intent intent = new Intent();
intent.setAction("MyReceiverAction");
intent.putExtra("msg", "HelloWorld!");
//發送普通廣播
//sendBroadcast(intent);
//放送有序廣播
sendOrderedBroadcast(intent,null);
放送有序廣播後,優先級高的MyReceiver先接收到廣播,並傳遞數據給MyReceiver1,
如果在MyReceiver的onReceiver()中調用abortBroadcast(),則MyReceiver1不會接收到廣播。