天天看點

廣播

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

一聽到廣播我們第一感覺就會聯想到小時候村裡面的廣播,每逢村裡有什麼活動都是通過廣播發送的。收聽收音機也是一種廣播,在收音機中有很多個廣播電台,每個廣播電台播放的内容都不相同。接受廣播時廣播(發送方)并不在意我們(接收方)接收到廣播時如何處理。好比我們收聽交通電台的廣播,電台中告訴我們現在在交通狀況如何,但它并不關心我們接收到廣播時做如何做出處理,這不是廣播應該關心的問題,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);

            }

        });

    }

}

<a href="http://www.cnblogs.com/TerryBlog/archive/2010/08/16/1801016.html">複制代碼</a>

接收器代碼如下:

public class myBroadCast extends BroadcastReceiver {

    public myBroadCast() {

        Log.v("BROADCAST_TAG", "myBroadCast");

    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 去處理

繼續閱讀