BroadCastReceiver用於監聽被廣播的事件(Itent)
為了達到這個目的,我們就必須進行BroadCastReceiver註冊,註冊共兩種方法:
<1>在應用程式代碼中進行註冊
這種註冊方法比較靈活,我們想什麼時候註冊就什麼時候註冊,什麼時候關閉就什麼時候關閉。
註冊BroadCastReceiver:
registerReeiver(receiver,filter)
取消BroadCastReceiver:
unregisterReeiver(receiver)
如果一個BroadCastReciver用於更新UI,通常會使用這種方法進行註冊,Activity啟動時就註冊BroadCastReciver,Activity不可見時就取消註冊。
步驟:1 產生一個BroadCastReceiver對象
2 產生一個Intentfilter對象
3 為Intentfilter對象添加一個Action
class RegisterReceiverListener implements OnClickListener{</p><p>public void onClick(View v) {<br />//產生一個BroiadcastReceiver對象<br />smsReceiver = new SMSReceiver();<br />//產生一個IntentFilter對象<br />IntentFilter filter = new IntentFilter();<br />//為IntentFilter添加一個Action<br />filter.addAction(SMS_ACTION);<br />//將BroadcastReceiver對象註冊到系統當中<br />TestBC2Activity.this.registerReceiver(smsReceiver, filter);<br />}</p><p> }</p><p> class UnRegisterReceiverListener implements OnClickListener{</p><p>public void onClick(View v) {<br />//解除BroadcastReceiver對象的註冊<br />TestBC2Activity.this.unregisterReceiver(smsReceiver);<br />}</p><p> }SMSReceiver.javapackage mars.testbc2;</p><p>import android.content.BroadcastReceiver;<br />import android.content.Context;<br />import android.content.Intent;<br />import android.os.Bundle;<br />import android.telephony.SmsMessage;</p><p>public class SMSReceiver extends BroadcastReceiver{</p><p>@Override<br />public void onReceive(Context context, Intent intent) {<br />// TODO Auto-generated method stub<br />System.out.println("receive message");</p><p>//接受Intent對象當中的資料<br />Bundle bundle = intent.getExtras();<br />//在Bundle對象當中有一個屬性名稱為pdus,這個屬性的值是一個Object數組<br />Object[] myOBJpdus = (Object[]) bundle.get("pdus");<br />//建立一個SmsMessage類型的數組<br /> SmsMessage[] messages = new SmsMessage[myOBJpdus.length];<br /> System.out.println(messages.length);<br /> for (int i = 0; i<myOBJpdus.length; i++)<br /> {<br /> //使用Object數組當中的對象建立SmsMessage對象<br /> messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);<br /> //調用SmsMessage對象的getDisppalyMessageBody()方法,就可以得到訊息的內容<br /> System.out.println(messages[i].getDisplayMessageBody());<br /> }<br /> try {<br />Thread.sleep(30 * 1000);<br />System.out.println("-------------------------------");<br />} catch (InterruptedException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />}<br />}</p><p>}<br />
<2>在AndroidManifest.xml當中進行註冊
<receiver android:name=".TestReceiver"><br /><intent-filter><br /><action android:name="android.intent.action.EDIT" /><br /></intent-filter><br /></receiver>
用這種方法註冊的有如下一種特點:
用這種方法註冊的應用程式的及時關閉了,BroadCastReceiver依然會接收到廣播出的一個對象,也就是說無論應用程式關與開,都處於一種活動狀態中,都接受到廣播事件。
有的應用程式就需要這種特點。
例如,開發一種應用程式,來檢測手機的耗電量。
我們不能總要求應用程式開啟,我們希望應用程式及時關閉了,也能照樣檢測手機的耗電量。
但是,我們如果開發的應用程式來更新手機控制項,採用這種方式就不太合適了。只有我們看到Activity,我們更新控制項採用意義。
如果沒看到Activity還照樣更新,除了耗電,消耗記憶體外,一點好處也沒有。所以就需要第一種方法。