Android Broadcast機制深入解析

衆所周知,Android的四大組件是Activity,Service,ContentProvider和Broadcast。可見Broadcast的重要性。何謂廣播機制,我想大家對廣播肯定不陌生,發出去的廣播,是沒有任何目的性的,沒有一個明確的目標,至於誰會收到,發送廣播的人肯定不會知道。android中的broadcast也是如此,一個activity發出廣播,也並不知道哪個activity會響應。那麼是什麼樣的activity會響應呢?一個activity是如何發送廣播呢?對於廣播我們又該如何處理呢?下面我們來一步一步瞭解。

 

首先,一個activity是如何發出一個廣播的?

是通過sendBroadcast()函數,函數的參數爲一個intent對象,該對象最重要的是定義了動作,將廣播發送出去後,能夠處理該動作的其他activity便能夠接收廣播,並作出響應。

 

那麼其他的activity是如何知道自己該接受什麼動作呢?

是通過過濾器fliter。在filter中定義了能夠響應的所有動作,如果廣播發出的動作存在於filter當中,該activity就響應,反之忽略廣播。

 

那麼,接受了廣播之後,該activity又該執行什麼操作呢?

這裏我們要說一下,對廣播的響應我們是通過類BroadcastReceiver來實現的,我們通過繼承該類,並重載其onReceive方法,能夠自定義執行後該做的處理。

 

我們還需要了解什麼是動作

所謂動作,即action,其實大體上說就是對要進行操作的描述。android給我們自定義了很多動作,例如ACTION_EDIT,ACTION_VIEW,等等。它們對即將進行的操作進行了描述,就像ACTION_EDIT,就將操作描述爲編輯。那麼能夠實現編輯功能的activity就會響應。系統定義的action有很多,在此不再贅述,大家想要詳細瞭解的話可以參考官方文檔。那麼除了官方提供的,我們用得更多的還是我們自定義的action,自己對要實現的動作做一個描述,通常的表示方法爲“包名”+“.”+“動作描述”。例如:“com.suns.HTTPRequestActivity.BUTTONCHANGE”,分解開即”com.suns.HTTPRequestActivity“+“.”+"BUTTONCHANGE"。就自定義了一個按鈕變化的action。其實這只是一個命名規律的字符串罷了,爲的只是讓intent和fliter能夠對應,還有讓人們知道這個動作是幹嘛的。

 

廣播能用幾種方法實現呢?它們有什麼區別聯繫?

實現廣播的方法有兩種。一種是在androidmanifest.xml當中去註冊廣播,另一種方法是在代碼中動態註冊廣播,這兩種方法雖然都能實現廣播機制,但是還是有很大不同,所以運用也要分情況。如果我們在androidmanifest.xml中去定義的話,那麼該廣播是在activity結束之後也不會結束的,原因在於它已經寫在了manifest.xml文件當中,也就是註冊到了系統當中,所以無論你的activity是否存在,對於該廣播沒有影響。而在java代碼中動態註冊廣播,在該activity結束後,我們可以註銷該廣播,也就是它隨着activity的消失而消失。這樣解釋,大家都應該清楚了。如果是一些系統應用,比如手機沒電後震動啊,後臺計算流量啊這樣的功能,需要一直存在的,我們可以在androidmanifest.xml中註冊,而一些只有該activity存在時纔有意義的廣播,比如更改界面等等,就用動態註冊比較合適,activity都沒了。該廣播還有什麼用呢?只會浪費資源而已。

 

好了,說了這麼多,我們還是需要用一個例子去應用一下它。

首先先是動態註冊廣播的,點擊界面上的button後,發送更改button的廣播,然後button變爲進度條。

 

代碼如下:

Broadcasttest.java:

 

 

Java代碼  收藏代碼
  1. package com.suns.ButtonChanged;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.view.View;  
  7.   
  8. public class Broadcasttest extends BroadcastReceiver{  
  9.   
  10.     @Override  
  11.     public void onReceive(Context arg0, Intent arg1) {  
  12.         // TODO Auto-generated method stub  
  13.         ButtonChangedActivity.getButton().setVisibility(View.GONE);  
  14.         ButtonChangedActivity.getBar().setVisibility(View.VISIBLE );  
  15.           
  16.     }  
  17.   
  18. }  
 

 

 

ButtonChangeActivity.java:

 

 

Java代碼  收藏代碼
  1. package com.suns.ButtonChanged;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.content.IntentFilter;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.ProgressBar;  
  11.   
  12. public class ButtonChangedActivity extends Activity {  
  13.     /** Called when the activity is first created. */  
  14.     private static Button button=null;  
  15.     private static ProgressBar bar=null;  
  16.     private Broadcasttest t;  
  17.     private IntentFilter filter;  
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.         button=(Button)findViewById(R.id.button);  
  23.         bar=(ProgressBar)findViewById(R.id.bar);  
  24.         button.setOnClickListener(new ButtonClick());  
  25.     }  
  26.       
  27.     public static Button getButton()  
  28.     {  
  29.         return button;  
  30.     }  
  31.       
  32.     public static ProgressBar getBar()  
  33.     {  
  34.         return bar;  
  35.     }  
  36.       
  37.       
  38.     @Override  
  39.     protected void onDestroy() {  
  40.         // TODO Auto-generated method stub  
  41.         super.onDestroy();  
  42.         ButtonChangedActivity.this.unregisterReceiver(t);         
  43.     }  
  44.   
  45.   
  46.   
  47.     class ButtonClick implements OnClickListener  
  48.     {  
  49.   
  50.         @Override  
  51.         public void onClick(View v) {  
  52.             // TODO Auto-generated method stub  
  53.             t=new Broadcasttest();  
  54.             filter=new IntentFilter();  
  55.             filter.addAction(Intent.ACTION_EDIT);  
  56.             Intent intent=new Intent();  
  57.             intent.setAction(Intent.ACTION_EDIT );  
  58.             ButtonChangedActivity.this.registerReceiver(t, filter);  
  59.             ButtonChangedActivity.this.sendBroadcast(intent);  
  60.           
  61.         }  
  62.     }  
  63. }  

 

 

 

我們用registerReceiver函數去註冊一個廣播響應事件,有兩個參數,第一個是我們自定義的receiver對象,第二個即是過濾器。

注意:我們要在activity的onDestroy()方法中註銷該廣播!

 

main.xml:

 

 

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.       
  7.     <Button   
  8.         android:id="@+id/button"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="點擊"  
  12.         />  
  13.   
  14.     <ProgressBar   
  15.         android:id="@+id/bar"  
  16.         android:visibility="gone"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         style="?android:attr/progressBarStyle"  
  20.         />  
  21.       
  22.       
  23. </LinearLayout>  

 

 

效果圖:

 


 

點擊後:

 


 

 

然後我們再寫一個在androidmanifest.xml中靜態註冊廣播的例子,上例情形已經不再適合(原因參見上文)。

 

Broadcasttest_Two.java

 

 

Java代碼  收藏代碼
  1. package com.suns.broadcast;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.util.Log;  
  7.   
  8. public class Broadcasttest_Two extends BroadcastReceiver{  
  9.   
  10.     @Override  
  11.     public void onReceive(Context arg0, Intent arg1) {  
  12.         // TODO Auto-generated method stub  
  13.         Log.i("MY_LOG""this is a broadcast example");  
  14.     }  
  15.   
  16. }  
 

 

Broadcast_twoActivity.java

 

 

Java代碼  收藏代碼
  1. package com.suns.broadcast;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.   
  10. public class Broadcast_twoActivity extends Activity {  
  11.     /** Called when the activity is first created. */  
  12.     private Button button=null;  
  13.     final private String Send="com.suns.Broadcast_twoActivity.SEND";  
  14.       
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.           
  20.         button=(Button)findViewById(R.id.button);  
  21.         button.setText("點擊發送廣播");  
  22.           
  23.         button.setOnClickListener(new OnClickListener(){  
  24.   
  25.             @Override  
  26.             public void onClick(View v) {  
  27.                 // TODO Auto-generated method stub  
  28.                 Intent intent =new Intent();  
  29.                 intent.setAction(Send);  
  30.                 Broadcast_twoActivity.this.sendBroadcast(intent);  
  31.             }  
  32.               
  33.         });  
  34.     }  
  35. }  
 

main.xml:

 

 

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7. <Button   
  8.     android:id="@+id/button"  
  9.     android:layout_width="fill_parent"  
  10.     android:layout_height="wrap_content"  
  11.     />  
  12.   
  13. </LinearLayout>  

 

 

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.suns.broadcast"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk android:minSdkVersion="4" />  
  8.   
  9.     <application  
  10.         android:icon="@drawable/ic_launcher"  
  11.         android:label="@string/app_name" >  
  12.         <activity  
  13.             android:name=".Broadcast_twoActivity"  
  14.             android:label="@string/app_name" >  
  15.             <intent-filter>  
  16.                 <action android:name="android.intent.action.MAIN" />  
  17.   
  18.                 <category android:name="android.intent.category.LAUNCHER" />  
  19.             </intent-filter>  
  20.         </activity>  
  21.           
  22.         <receiver   
  23.             android:name="Broadcasttest_Two">  
  24.             <intent-filter>  
  25.                 <action android:name="com.suns.Broadcast_twoActivity.SEND"></action>  
  26.             </intent-filter>  
  27.         </receiver>  
  28.     </application>  
  29.   
  30. </manifest>  

 

 

效果圖:

 


 

點擊後:

 


 

好了,關於android中的broadcast我就介紹到這裏,謝謝你的觀看。

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