Android廣播機制簡介:
在Android中,有一些操作完成以後,會發送廣播,比如說發出一條簡訊或者打出一個電話,如果某個程式接收了這條廣播,就會做相應的處理。而且該廣播可以被不止一個應用程式所接收,當然也可以不被任何程式所接收。
廣播機制最大的特點就是發送方並不關心接收方是否接收資料,也不關心接收方如何處理資料。
對於該廣播是否被一個應用程式所接收,取決於這個應用程式是否註冊BroadcastReceiver,因為roadcastReceiver用於監聽被廣播的事件(intent),為了達到這個目的,BroadcastReceiver必須被註冊,註冊的方法有以下兩種:
1、靜態註冊方法
在AndroidManifest.xml的application裡面定義receiver並設定要接收的action
其特點為:不管該應用程式是否處於活動狀態,都會進行監聽。
也就是說,這個程式無論是否開啟,都會接收廣播,並作出相應處理。如果一個程式接收是手機電量低的提醒,那麼這個機制就很適合,因為不用顧忌這個程式是否關閉或者開啟,都能得到手機電量低的提醒。但是,如果是接收某個廣播來對該程式的Activity首頁面的改變,那麼這種機制就沒有必要,因為當程式關閉時,我們不會關心這個程式頁面的變化,而造成電量以及手機效能的影響。
2、在應用程式中註冊
如果想避免上一種後果,那麼就可以在應用程式中註冊BroadcastReceiver。這樣可以很方便的註冊和取消註冊,從而決定對廣播是否接受。
下面是靜態註冊的執行個體:
廣播發送:
package com.ye_yun_lin.broadcastreceiver;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent();intent.setAction(intent.ACTION_EDIT);MainActivity.this.sendBroadcast(intent);}});}}
廣播接收:
package com.ye_yun_lin.broadcastreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class Receiver extends BroadcastReceiver {public Receiver(){System.out.println("--Receiver");}@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("--onReceiver");}}
BroadcastReceiver註冊:
輸出結果:
下面是在應用程式中註冊的執行個體:
public class SMSReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubSystem.out.println("receive message");//接受Intent對象當中的資料Bundle bundle = intent.getExtras();//在Bundle對象當中有一個屬性名稱為pdus,這個屬性的值是一個Object數組Object[] myOBJpdus = (Object[]) bundle.get("pdus"); //建立一個SmsMessage類型的數組 SmsMessage[] messages = new SmsMessage[myOBJpdus.length]; System.out.println(messages.length); for (int i = 0; ipublic class TestBC2Activity extends Activity { /** Called when the activity is first created. */private Button registerButton = null;private Button unregisterButton = null;private SMSReceiver smsReceiver = null;private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); registerButton = (Button)findViewById(R.id.register); registerButton.setOnClickListener(new RegisterReceiverListener()); unregisterButton = (Button)findViewById(R.id.unregister); unregisterButton.setOnClickListener(new UnRegisterReceiverListener()); } class RegisterReceiverListener implements OnClickListener{@Overridepublic void onClick(View v) {//產生一個BroiadcastReceiver對象smsReceiver = new SMSReceiver();//產生一個IntentFilter對象IntentFilter filter = new IntentFilter();//為IntentFilter添加一個Actionfilter.addAction(SMS_ACTION);//將BroadcastReceiver對象註冊到系統當中TestBC2Activity.this.registerReceiver(smsReceiver, filter);} } class UnRegisterReceiverListener implements OnClickListener{@Overridepublic void onClick(View v) {//解除BroadcastReceiver對象的註冊TestBC2Activity.this.unregisterReceiver(smsReceiver);} }}