點滴:Android BroadcastReceiver【轉】

1.BroadCast 廣播:


使用很簡單,實例化一個意圖對象,把要發送的信息封裝在意圖對象中,然後使用


Context。sendBroadCast()方法,把意圖對象發送(即廣播)出去。


代碼示例:

 

 

Java代碼  收藏代碼
  1. //用給出的action創建一個意圖對象,該action在廣播過濾器中要用到  
  2. Intent intent  = new Intent("bc1");   
  3. //要廣播的信息  
  4. intent.putExtra("val", BroadcastReceiver1.class.getName());  
  5. //發送廣播  
  6. sendBroadcast(intent);  

 
 2.BroadCastReceiver廣播接收器:

必須建立一個廣播接收器來接收廣播消息,廣播接收器的核心是過濾器IntentFilter。

 

建立廣播接收器分爲靜態建立和動態建立:

 

首先要新建一個廣播接收類繼承BroadcastReceiver,重寫onReceive方法;

 

代碼示例,BroadcastReceiver1 .java:

 

 

Java代碼  收藏代碼
  1. public class BroadcastReceiver1 extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context arg0, Intent arg1) {  
  5.         String val = arg1.getStringExtra("val");  
  6.         Toast.makeText(arg0, "Get message:"+val, Toast.LENGTH_LONG).show();  
  7.     }  
  8.   
  9. }  
 

 

①如果是靜態建立:在清單文件中註冊BroadCastReceiver;

 

代碼示例,AndroidManifest.xml:

 

 

Xml代碼  收藏代碼
  1. <receiver android:name=".BroadcastReceiver1">  
  2.             <intent-filter >  
  3.                 <action android:name="bc1"/>  
  4.             </intent-filter>  
  5. </receiver>  
 

 

receiver節點的android:name是廣播接收類的類名,intent-filter節點的android:name爲要過濾的廣播消息,只接受

 

action="bc1"的廣播。

 

這樣通過sendBoardCast(intent)發送出來的廣播,被該廣播接收器通過廣播過濾器匹配後接收,並通過onReceive()方

 

法處理接收到的信息,完成了整個信息傳遞的過程。

 

②如果是動態建立,不需要在清單文件中註冊BroadCastReceiver,在發送廣播的類中實例化一個IntentFiltler的成員變

 

量,並在onStart()方法中註冊廣播過濾器,在onStop()方法中註銷廣播過濾器。

 

代碼示例:

 

 

Java代碼  收藏代碼
  1. public class MainAct extends Activity {  
  2.       
  3.     IntentFilter intentFilter = new IntentFilter();  
  4.     BroadcastReceiver2 bc2 = new BroadcastReceiver2();  
  5.        ......  
  6.       
  7.     @Override  
  8.     protected void onStart() {  
  9.         super.onStart();  
  10.         intentFilter.addAction("bc2");  
  11.         registerReceiver(bc2, intentFilter);//註冊監聽  
  12.     }  
  13.     @Override  
  14.     protected void onStop() {  
  15.         super.onStop();  
  16.         unregisterReceiver(bc2); //取消監聽  
  17.     }  
  18.       
  19. }  

 

--------------------------------------------------本示例完整代碼--------------------------------------------------------------

 

AndroidManifest.xml:

 

 

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.wyx.demo"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <uses-sdk android:minSdkVersion="8" />  
  7.   
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  9.         <activity android:name=".MainAct"  
  10.                   android:label="@string/app_name">  
  11.             <intent-filter>  
  12.                 <action android:name="android.intent.action.MAIN" />  
  13.                 <category android:name="android.intent.category.LAUNCHER" />  
  14.             </intent-filter>  
  15.         </activity>  
  16.           
  17.         <receiver android:name=".BroadcastReceiver1">  
  18.             <intent-filter >  
  19.                 <action android:name="bc1"/>  
  20.             </intent-filter>  
  21.         </receiver>  
  22.     </application>  
  23. </manifest>  
 

 

MainAct.java:

 

 

Java代碼  收藏代碼
  1. /** 
  2.  * 該頁面負責發送廣播信息: 
  3.  * 發送廣播消息,把要發送的信息和用於過濾的信息(如Action、Category)裝入一個Intent對象, 
  4.  * 然後通過調用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法, 
  5.  * 把 Intent對象以廣播方式發送出去。  
  6.  */  
  7. public class MainAct extends Activity {  
  8.      
  9.     IntentFilter intentFilter = new IntentFilter();  
  10.     BroadcastReceiver2 bc2 = new BroadcastReceiver2();  
  11.       
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.           
  17.         Button btn1 = (Button)findViewById(R.id.btn1);  
  18.         btn1.setOnClickListener(new View.OnClickListener() {  
  19.             @Override  
  20.             public void onClick(View v) {  
  21.                 Intent intent  = new Intent("bc1");  
  22.                 intent.putExtra("val", BroadcastReceiver1.class.getName());  
  23.                 sendBroadcast(intent);  
  24.             }  
  25.         });  
  26.           
  27.         Button btn2 = (Button)findViewById(R.id.btn2);  
  28.         btn2.setOnClickListener(new View.OnClickListener() {  
  29.             @Override  
  30.             public void onClick(View v) {  
  31.                 Intent intent  = new Intent("bc2");  
  32.                 intent.putExtra("val", BroadcastReceiver2.class.getName());  
  33.                 sendBroadcast(intent);  
  34.             }  
  35.         });  
  36.     }  
  37.       
  38.     @Override  
  39.     protected void onStart() {  
  40.         super.onStart();  
  41.         intentFilter.addAction("bc2");  
  42.         registerReceiver(bc2, intentFilter);//註冊監聽  
  43.     }  
  44.     @Override  
  45.     protected void onStop() {  
  46.         super.onStop();  
  47.         unregisterReceiver(bc2); //取消監聽  
  48.     }  
  49.       
  50. }  

 

 BroadcastReceiver1.java:

 

 

Java代碼  收藏代碼
  1. public class BroadcastReceiver1 extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context arg0, Intent arg1) {  
  5.         String val = arg1.getStringExtra("val");  
  6.         Toast.makeText(arg0, "Get message:"+val, Toast.LENGTH_LONG).show();  
  7.     }  
  8.   
  9. }  


Context.sendBroad()主要是用來廣播無序事件(也被稱爲有序廣播 Normal broadcast),即所有的接收者在理論上是同時接收到事件,同時執行的,對消息傳遞的效率而言這是比較好的做法。

Context.sendOrderedBroadcast()方法用來向系統廣播有序事件(Ordered broadcast),接收者按照在Manifest.xml文件中設置的接收順序依次接收Intent,順序執行的,接收的優先級可以在系統配置文件中設置(聲明在intent-filter元素的android:priority屬性中,數值越大優先級別越高,其取值範圍爲-1000到1000。當然也可以在調用IntentFilter對象的setPriority()方法進行設置)。對於有序廣播而言,前面的接收者可以對接收到得廣播意圖(Intent)進行處理,並將處理結果放置到廣播意圖中,然後傳遞給下一個接收者,當然前面的接收者有權終止廣播的進一步傳播。如果廣播被前面的接收者終止後,後面的接收器就再也無法接收到廣播了。

 

廣播接收器(Broadcaset)運行的線程:

       無論對於有序廣播還是無序廣播,廣播接收器默認都是運行在主線程中的(main線程,即UI線程)。可以通過在程序中使用registerReceiver(receiver, filter, broadcastPermission, scheduler)方法中的最後一個參數指定要運行的廣播接收器的線程。也可以在Manifest.xml文件中設置(Intent-filter標籤中設置android:process)。

 

無序廣播(Normal Broadcast)

       基本步驟:寫一個類繼承BroadcastReceiver,並重寫onReceive方法,而後在AndroidManifest.xml文中中進行配置,或者直接在代碼中註冊。


 

 

發佈了5 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章