圖解 Android 廣播機制

作者: Terry_龍  來源: 博客園  發布時間: 2010-08-18 11:12  閱讀: 2703 次  推薦: 0   原文鏈接   [收藏]  

  從現實生活中理解廣播機制

  一聽到廣播我們第一感覺就會聯想到小時候村里面的廣播,每逢村里有什么活動都是通過廣播發送的。收聽收音機也是一種廣播,在收音機中有很多個廣播電臺,每個廣播電臺播放的內容都不相同。接受廣播時廣播(發送方)并不在意我們(接收方)接收到廣播時如何處理。好比我們收聽交通電臺的廣播,電臺中告訴我們現在在交通狀況如何,但它并不關心我們接收到廣播時做如何做出處理,這不是廣播應該關心的問題,OK,到這里我們從生活中的一些小例子淺淺的理解了一下廣播,那么Android 中的廣播是如何操作的呢?

  Android 的廣播機制

  在 Android 里面有各種各樣的廣播,比如電池的使用狀態,電話的接收和短信的接收都會產生一個廣播,應用程序開發者也可以監聽這些廣播并做出程序邏輯的處理。下面我畫一張粗略的圖來幫助大家理解廣播的運行機制。

  Android 中有各式各樣的廣播,各種廣播在Android 系統中運行,當系統/應用程序運行時便會向 Android 注冊各種廣播,Android 接收到廣播會便會判斷哪種廣播需要哪種事件,然后向不同需要事件的應用程序注冊事件,不同的廣播可能處理不同的事件也可能處理相同的廣播事件,這時就需要Android 系統為我們做篩選。

  案例分析:

  一個經典的電話黑名單,首先通過將黑名單號碼保存在數據庫里面,當來電時,我們接收到來電廣播并將黑名單號碼與數據庫中的某個數據做匹配,如果匹配的話則做出相應的處理,比如掛掉電話、比如靜音等等。

  Demo 分析:

  下面通過一個小DEMO 來講解一下廣播在Android 中如何編寫,在Demo中我們設置了一個按鈕為按鈕設置點擊監聽通過點擊發送廣播,在后臺中接收到廣播并打印LOG信息。代碼如下:

BroadCastActivity 頁面代碼
public class BroadCastActivity extends Activity {
    
public static final String ACTION_INTENT_TEST = "com.terry.broadcast.test";

    
/** Called when the activity is first created. */
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btn 
= (Button) findViewById(R.id.Button01);
        btn.setOnClickListener(
new OnClickListener() {

            @Override
            
public void onClick(View v) {
                
// TODO Auto-generated method stub
                Intent intent = new Intent(ACTION_INTENT_TEST);
                sendBroadcast(intent);
            }
        });
    }
}

  接收器代碼如下:

public class myBroadCast extends BroadcastReceiver {

     
    
public myBroadCast() {
        Log.v(
"BROADCAST_TAG""myBroadCast");
    }

    @Override
    
public void onReceive(Context context, Intent intent) {
        
// TODO Auto-generated method stub
        Log.v("BROADCAST_TAG""onReceive");
    }

}

  Android 廣播的生命周期

  在上面的接收器中,繼承了BroadcastReceiver 并重寫了它的onReceive 并構造了一個函數,下面通過圖片來一步一步認識 Android 廣播的生命周期。當我點擊一下按鈕,它向Android 發送了一個廣播,如下圖:

  這時我們再點擊一下按鈕,它還是會再向 Android 系統發送廣播,此時日志信息如下:

  下面本人畫一張圖像,描述了Android 中廣播的生命周期,其次它并不像Activity 一樣復雜,運行原理很簡單如下圖:

  下面來看一下SDK給出的解釋:

  大意為:如果一個廣播處理完onReceive 那么系統將認定此對象將不再是一個活動的對象,也就會finished掉它。至此,大家應該能明白 Android 的廣播生命周期的原理,代碼也不用多介紹,很簡單的一個發送廣播并處理廣播的Demo。

  Android 如何判斷并篩選廣播?

  前面說過 Android 的廣播有各式各樣,那么Android 系統是如何幫我們處理我們需要哪種廣播并為我們提供相應的廣播服務呢?這里有一點需要大家注意,每實現一個廣播接收類必須在我們應用程序中的 manifest 中顯式的注明哪一個類需要廣播,并為其設置過濾器,如下圖:

  Tip:action 代表一個要執行的動作,在Andriod 中有很action 比如 ACTION_VIEW,ACTION_EDIT

 

  那么有些人會問了,如果我在一個廣播接收器中要處理多個動作呢?那要如何去處理?
  在Android 的接收器中onReceive 以經為我們想到的,同樣的你必須在Intent-filter 里面注冊該動作,可以是系統的廣播動作也可以是自己需要的廣播,之后你之需要在onReceive 方法中,通過intent.getAction()判斷傳進來的動作即可做出不同的處理,不同的動作。具體大家可以去嘗試測試一下。
  小結:
  • 在Android 中如果要發送一個廣播必須使用sendBroadCast 向系統發送對其感興趣的廣播接收器中。
  • 使用廣播必須要有一個intent 對象必設置其action動作對象
  • 使用廣播必須在配置文件中顯式的指明該廣播對象
  • 每次接收廣播都會重新生成一個接收廣播的對象
  • 在BroadCast 中盡量不要處理太多邏輯問題,建議復雜的邏輯交給Activity 或者 Service 去處理

 

0
0
 
標簽:Android
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()