android BroadcastReceiver 使用小結

BroadcastReceiver 做爲android4大組件之一,使用的很廣泛,下面是對使用BroadcastReceiver一些總結。html

1. Android 廣播機制的三要素:android

廣播(Broadcast) - 用於發送廣播;
廣播接收器(BroadcastReceiver) - 用於接收廣播;
意圖內容(Intent)-用於保存廣播相關信息的媒介。
Broadcast是一種普遍運用的在應用程序之間傳輸信息的機制。
而BroadcastReceiver是對發送出來的Broadcast進行過濾接受並響應的一類組件。app

2.BroadcastReceiver的註冊ide

BroadcastReceiver的註冊有兩種方式,靜態註冊和動態註冊。函數

2.1靜態註冊this

靜態註冊經過在spa

AndroidManifest.xml文件中進行註冊。.net

 

[html] view plain copy線程

print?在CODE上查看代碼片派生到個人代碼片code

  1. <receiver   
  2. <span style="white-space:pre">    </span>android:name="com.example.testbroadcastreceiver.TestBroadcastReceiver"   
  3.     android:enabled="true"  
  4.     android:exported="false"  
  5.     android:process=":test"  
  6.     >  
  7.     <intent-filter>  
  8.         <action android:name="android.intent.action.EDIT" />  
  9.     </intent-filter>  
  10. </receiver>  

 

涉及的屬性包括:

android:name:broadcastReceiver的類名。

android:exported:決定此broadcastReceiver可否接收其餘應用發送的廣播,該屬性默認值由receiver是否設 置<intent-filter>有關,當設置了<intent-filter>時,該屬性的默認值爲true,不然爲 false。

android:permission:設置廣播發送方的權限,具有相應權限的發送方發送的廣播能夠被該receiver接收。

android:process:設置receiver運行時所處的進程的名稱。設置服務所在進程名稱是由用戶決定的,當進程名以冒號":"開始時 表示該進程是應用的私有進程,這時候會把進程名附加到包名後面造成新的進程名。當進程名是以小寫字母開頭時,則表示這個服務將運行在一個以這個名字命名的 全局的進程中,但前提是該進程必須具有相應的權限。

<intent-filter>用於指定此廣播接收器將用於接收特定的廣播類型。

2.2動態註冊

BroadcastReceiver的動態註冊經過在代碼中調用registerReceiver函數,必須在合適的地方調用 unregisterReceiver()註銷注動態註冊的BroadcastReceiver,例如在Activity的onDestroy函數裏註銷 廣播。

動態註冊的代碼:

 

[html] view plain copy

print?在CODE上查看代碼片派生到個人代碼片

  1. it = new Intent(Intent.ACTION_EDIT);  
  2. it.putExtra("msg", "boardreceiver test");  
  3. IntentFilter filter = new IntentFilter(Intent.ACTION_EDIT);  
  4. MainActivity.this.receiver = new TestBroadcastReceiver();  
  5. MainActivity.this.registerReceiver(receiver, filter);  


BroadcastReceiver註銷:

 

 

[html] view plain copy

print?在CODE上查看代碼片派生到個人代碼片

  1. @Override  
  2. public void onDestroy()  
  3. {  
  4.     super.unregisterReceiver(receiver);  
  5.     super.onStop();  
  6. }  

 

 

3. BroadcastReceiver使用方法

3.1定義BroadcastReceiver

自定義BroadcastReceiver,重寫onReceive()方法,當接收到廣播時,會回調此方法,在此作須要處理的工做。代碼例子以下:

 

[html] view plain copy

print?在CODE上查看代碼片派生到個人代碼片

  1. class TestBroadcastReceiver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         // TODO Auto-generated method stub  
  6.         System.out.println("onReceiver Boardcast test2");  
  7.         if("android.intent.action.EDIT".equals(intent.getAction()))  
  8.         {  
  9.             test.setText("已經接收廣播");  
  10.             String msg = intent.getStringExtra("msg");  
  11.             System.out.println("msg" + msg);  
  12.             Toast.makeText(context, "TestBroadcastReceiver2", Toast.LENGTH_SHORT).show();  
  13.         }  
  14.     }  
  15. }  


3.2註冊BroadcastReceiver,能夠經過靜態和動態註冊廣播。

 

靜態註冊直接在AndroidManifest.xml裏面註冊:

 

[html] view plain copy

print?在CODE上查看代碼片派生到個人代碼片

  1. <receiver   
  2.     android:name="com.example.testbroadcastreceiver.TestBroadcastReceiver"   
  3.     android:enabled="true"  
  4.     android:exported="false"  
  5.     android:process=":test"  
  6.     >  
  7.     <intent-filter>  
  8.         <action android:name="android.intent.action.EDIT" />  
  9.     </intent-filter>  
  10. </receiver>  

動態註冊:

 

 

[html] view plain copy

print?在CODE上查看代碼片派生到個人代碼片

  1. IntentFilter filter = new IntentFilter(Intent.ACTION_EDIT);  
  2. MainActivity.this.receiver = new TestBroadcastReceiver();  
  3. MainActivity.this.registerReceiver(receiver, filter);  

3.3發送廣播

 

調用Context的sendBroadcast()進行發送廣播

 

[html] view plain copy

print?在CODE上查看代碼片派生到個人代碼片

  1. Intent it = new Intent(Intent.ACTION_EDIT);  
  2. it.putExtra("msg", "boardreceiver test2222");  
  3. MainActivity.this.sendBroadcast(it);  

3.4接收廣播

廣播接收完成後將會回調onReceive()方法,在此方法執行須要的操做。須要注意的是,BroadcastReceiver是運行在UI主線程的,因此不能在此作過多耗時的操做。

 

4. 注意問題

1. 一個廣播使用了靜態註冊和動態註冊,則會註冊兩次廣播接收者。

2. 當發送廣播被不想被除應用第三方接收時,應該給broadcast發送方設置permission權限。

3. 當本身廣播接收器須要過濾特定廣播來源時,須要給廣播接收器設置intent-filter指定接收廣播的類型。

4. onReceive()方法運行在主線程,不能作耗時的操做,不然會致使主線程阻塞,須要處理耗時操做時能夠經過啓動一個service進行處理。

5. 自定義BroadcastReceiver做爲Activity的內部類時,須要使用動態註冊的方式,不然會報Java.lang.InstantiationException:  no empty constructor異常。

6. 當接收到廣播時,會從新建立BroadcastReceiver對象,回調onReceive()函數,以後BroadcastReceiver對象將被銷燬。

相關文章
相關標籤/搜索