在部落格園的一個文章裡面,我看到了這樣一個對android廣播機制的分解,感覺非常到位,通俗易懂,順便在這裡剪下過來和大家分享一下:
摘自:http://www.cnblogs.com/TerryBlog/archive/2010/08/16/1801016.html
從現實生活中理解廣播機制
一聽到廣播我們第一感覺就會聯想到小時候村裡面的廣播,每逢村裡有什麼活動都是通過廣播發送的。收聽收音機也是一種廣播,在收音機中有很多個廣播電台,每個廣播電台播放的內容都不相同。接受廣播時廣播(發送方)並不在意我們(接收方)
接收到廣播時如何處理。好比我們收聽交通電台的廣播,電台中告訴我們現在在交通狀況如何,但它並不關心我們接收到廣播時做如何做出處理,這不是廣播應該關
心的問題,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 去處理
從現實生活中理解廣播機制
一聽到廣播我們第一感覺就會聯想到小時候村裡面的廣播,每逢村裡有什麼活動都是通過廣播發送的。收聽收音機也是一種廣播,在收音機中有很多個廣播電台,每個廣播電台播放的內容都不相同。接受廣播時廣播(發送方)並不在意我們(接收方)
接收到廣播時如何處理。好比我們收聽交通電台的廣播,電台中告訴我們現在在交通狀況如何,但它並不關心我們接收到廣播時做如何做出處理,這不是廣播應該關
心的問題,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 去處理