BroadcastReceiver(一)

一 、註冊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不會接收到廣播。

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