Android Broadcast廣播機(jī)制深入解析
眾所周知,Android的四大組件是Activity,Service,ContentProvider和Broadcast。可見 Broadcast的重要性。何謂廣播機(jī)制,我想大家對(duì)廣播肯定不陌生,發(fā)出去的廣播,是沒有任何目的性的,沒有一個(gè)明確的目標(biāo),至于誰會(huì)收到,發(fā)送廣播 的人肯定不會(huì)知道。
android中的broadcast也是如此,一個(gè)activity發(fā)出廣播,也并不知道哪個(gè)activity會(huì)響應(yīng)。那么是什么樣的activity會(huì)響應(yīng)呢?一個(gè)activity是如何發(fā)送廣播呢?對(duì)于廣播我們又該如何處理呢?下面我們來一步一步了解。
首先,一個(gè)activity是如何發(fā)出一個(gè)廣播的?
是通過sendBroadcast()函數(shù),函數(shù)的參數(shù)為一個(gè)intent對(duì)象,該對(duì)象最重要的是定義了動(dòng)作,將廣播發(fā)送出去后,能夠處理該動(dòng)作的其他activity便能夠接收廣播,并作出響應(yīng)。
那么其他的activity是如何知道自己該接受什么動(dòng)作呢?
是通過過濾器fliter。在filter中定義了能夠響應(yīng)的所有動(dòng)作,如果廣播發(fā)出的動(dòng)作存在于filter當(dāng)中,該activity就響應(yīng),反之忽略廣播。
那么,接受了廣播之后,該activity又該執(zhí)行什么操作呢?
這里我們要說一下,對(duì)廣播的響應(yīng)我們是通過類BroadcastReceiver來實(shí)現(xiàn)的,我們通過繼承該類,并重載其onReceive方法,能夠自定義執(zhí)行后該做的處理。
我們還需要了解什么是動(dòng)作
所謂動(dòng)作,即action,其實(shí)大體上說就是對(duì)要進(jìn)行操作的描述。android給我們自定義了很多動(dòng)作,例如 ACTION_EDIT,ACTION_VIEW,等等。它們對(duì)即將進(jìn)行的操作進(jìn)行了描述,就像ACTION_EDIT,就將操作描述為編輯。那么能夠?qū)?現(xiàn)編輯功能的activity就會(huì)響應(yīng)。系統(tǒng)定義的action有很多,在此不再贅述,大家想要詳細(xì)了解的話可以參考官方文檔。那么除了官方提供的,我們 用得更多的還是我們自定義的action,自己對(duì)要實(shí)現(xiàn)的動(dòng)作做一個(gè)描述,通常的表示方法為“包名”+“.”+“動(dòng)作描述”。例 如:“com.suns.HTTPRequestActivity.BUTTONCHANGE”,分解開 即”com.suns.HTTPRequestActivity“+“.”+"BUTTONCHANGE"。就自定義了一個(gè)按鈕變化的action。其實(shí) 這只是一個(gè)命名規(guī)律的字符串罷了,為的只是讓intent和fliter能夠?qū)?yīng),還有讓人們知道這個(gè)動(dòng)作是干嘛的。
廣播能用幾種方法實(shí)現(xiàn)呢?它們有什么區(qū)別聯(lián)系?
實(shí)現(xiàn)廣播的方法有兩種。一種是在androidmanifest.xml當(dāng)中去注冊(cè)廣播,另一種方法是在代碼中動(dòng)態(tài)注冊(cè)廣播,這兩種方法雖然都能實(shí) 現(xiàn)廣播機(jī)制,但是還是有很大不同,所以運(yùn)用也要分情況。如果我們?cè)赼ndroidmanifest.xml中去定義的話,那么該廣播是在activity 結(jié)束之后也不會(huì)結(jié)束的,原因在于它已經(jīng)寫在了manifest.xml文件當(dāng)中,也就是注冊(cè)到了系統(tǒng)當(dāng)中,所以無論你的activity是否存在,對(duì)于該 廣播沒有影響。而在java代碼中動(dòng)態(tài)注冊(cè)廣播,在該activity結(jié)束后,我們可以注銷該廣播,也就是它隨著activity的消失而消失。這樣解 釋,大家都應(yīng)該清楚了。如果是一些系統(tǒng)應(yīng)用,比如手機(jī)沒電后震動(dòng)啊,后臺(tái)計(jì)算流量啊這樣的功能,需要一直存在的,我們可以在 androidmanifest.xml中注冊(cè),而一些只有該activity存在時(shí)才有意義的廣播,比如更改界面等等,就用動(dòng)態(tài)注冊(cè)比較合 適,activity都沒了。該廣播還有什么用呢?只會(huì)浪費(fèi)資源而已。
好了,說了這么多,我們還是需要用一個(gè)例子去應(yīng)用一下它。
首先先是動(dòng)態(tài)注冊(cè)廣播的,點(diǎn)擊界面上的button后,發(fā)送更改button的廣播,然后button變?yōu)檫M(jìn)度條。
代碼如下:
Broadcasttest.java:
- package com.suns.ButtonChanged;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.view.View;
- public class Broadcasttest extends BroadcastReceiver{
- @Override
- public void onReceive(Context arg0, Intent arg1) {
- // TODO Auto-generated method stub
- ButtonChangedActivity.getButton().setVisibility(View.GONE);
- ButtonChangedActivity.getBar().setVisibility(View.VISIBLE );
- }
- }
下一頁將為您介紹ButtonChangeActivity.java實(shí)現(xiàn)代碼以及main.xml
#p#
ButtonChangeActivity.java:
- package com.suns.ButtonChanged;
- import android.app.Activity;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ProgressBar;
- public class ButtonChangedActivity extends Activity {
- /** Called when the activity is first created. */
- private static Button button=null;
- private static ProgressBar bar=null;
- private Broadcasttest t;
- private IntentFilter filter;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- button=(Button)findViewById(R.id.button);
- bar=(ProgressBar)findViewById(R.id.bar);
- button.setOnClickListener(new ButtonClick());
- }
- public static Button getButton()
- {
- return button;
- }
- public static ProgressBar getBar()
- {
- return bar;
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- ButtonChangedActivity.this.unregisterReceiver(t);
- }
- class ButtonClick implements OnClickListener
- {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- t=new Broadcasttest();
- filter=new IntentFilter();
- filter.addAction(Intent.ACTION_EDIT);
- Intent intent=new Intent();
- intent.setAction(Intent.ACTION_EDIT );
- ButtonChangedActivity.this.registerReceiver(t, filter);
- ButtonChangedActivity.this.sendBroadcast(intent);
- }
- }
- }
我們用registerReceiver函數(shù)去注冊(cè)一個(gè)廣播響應(yīng)事件,有兩個(gè)參數(shù),***個(gè)是我們自定義的receiver對(duì)象,第二個(gè)即是過濾器。
注意:我們要在activity的onDestroy()方法中注銷該廣播!
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <Button
- android:id="@+id/button"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="點(diǎn)擊"
- />
- <ProgressBar
- android:id="@+id/bar"
- android:visibility="gone"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- style="?android:attr/progressBarStyle"
- />
- </LinearLayout>