標籤:android style blog java color 使用
一、接收廣播訊息
1.什麼是BroadcastReceiver?
BroadcastReceiver是Android系統四大組件之一,本質上就是一種全域的監聽器,用於監聽系統全域的廣播訊息。
2.怎樣建立BroadcastReceiver?
1)建立一個類繼承自BroadcastReceiver類;
2)在AndroidManifest.xml配置<receiver>節點資訊。
3.一旦實現了BroadcastReceiver,接下來就應該制定該BroadcastReceiver能匹配的Intent,此時有兩種方式。
1)在AndroidManifest.xml檔案中配置,這種方式會一直監聽。例如如下代碼:
<receiver android:name="com.gnnuit.smsreceiver.SmsReceiver" > <intent-filter android:priority="1000" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
2)使用代碼進行指定,調用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法指定,這種方式可以通過unregisterReceiver(BroadcastReceiver receiver)取消監聽,也叫臨時監聽。例如如下代碼:
IntentFilter filter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(new SmsReceiver(), filter);
4.如果BroadcastReceiver的onReceive()方法不能在10秒內執行完成,Android會認為該程式無響應。所以不要在BroadcastReceiver的onReceive()方法裡執行一些耗時的操作,否則會發生ANR異常。如果確實需要根據Broadcast來完成一些耗時的操作,則可以考慮通過Intent啟動一個Service來完成該操作。不應考慮使用新線程去完成耗時操作,因為Broadcast本身的生命週期很短。
5.Broadcast被分為如下兩種:
1)Normal Broadcast(普通廣播):普通廣播是完全非同步,可以在同一時刻(邏輯上)被所有接收者接收到,訊息傳遞的效率比較高。但缺點是接收者不能將處理結果傳遞給下一個接收者,並且無法終止Broadcast Intent的傳播。
2)Ordered Broadcast(有序廣播):有序廣播的接收者將按預先聲明的優先順序依次接收Broadcast。優先順序別聲明在<intent-filter/>元素的android:priority屬性中,數越大優先順序別越高,取值範圍為-1000-1000.有序廣播可以調用abortBroadcast()方法終止Broadcast Intent的傳播,Broadcast Intent的傳播一旦終止,後面的接收者就無法接收到Broadcast。
6.用於發送廣播的兩個方法:
1)sendBroadcast():發送普通廣播。
2)sendOrderedBroadcast():發送有序廣播。
7.簡訊攔截執行個體
SmsReceiver.java
package com.gnnuit.smsreceiver;import java.util.Date;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.telephony.SmsMessage;public class SmsReceiver extends BroadcastReceiver { // 當接收到簡訊時被觸發 @Override public void onReceive(Context context, Intent intent) { System.out.println("接收到簡訊!!!"); Object[] pdus = (Object[]) intent.getExtras().get("pdus");// 通過pdus可以獲得接收到的所有簡訊訊息 for (Object pdu : pdus) { SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu); String content = message.getMessageBody();// 獲得簡訊內容 String number = message.getOriginatingAddress();// 獲得簡訊號碼 Date date = new Date(message.getTimestampMillis());// 獲得簡訊日期 System.out.println(number + "," + content + "," + date); if ("110".equals(number)) { abortBroadcast();// 取消廣播,讓系統收不到簡訊 } } }}
AndroidManifest.xml
<receiver android:name="com.gnnuit.smsreceiver.SmsReceiver" > <intent-filter android:priority="1000" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>