本文為《Android/OPhone開發(fā)完全講義》一書的內(nèi)容連載。轉(zhuǎn)載請注明出處
短信是手機(jī)中經(jīng)常使用到的一種服務(wù)。然而,當(dāng)手機(jī)接收到短信時,也會向系統(tǒng)發(fā)送廣播。如果我們的應(yīng)用程序要在手機(jī)接收到短信后做點(diǎn)什么,那就需要接收這個系統(tǒng)廣播。
接收系統(tǒng)廣播的步驟我們已經(jīng)熟悉了,下面就按步就班地來完成這兩個步驟。
1.
編寫一個SMSReceiver
類來接收系統(tǒng)廣播。
package net.blogjava.mobile.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;
import android.widget.Toast;
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// 判斷接收到的廣播是否為收到短信的Broadcast Action
if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction()))
{
StringBuilder sb = new StringBuilder();
// 接收由SMS傳過來的數(shù)據(jù)
Bundle bundle = intent.getExtras();
// 判斷是否有數(shù)據(jù)
if (bundle != null)
{
// 通過pdus可以獲得接收到的所有短信消息
Object[] objArray = (Object[]) bundle.get("pdus");
// 構(gòu)建短信對象array,并依據(jù)收到的對象長度來創(chuàng)建array的大小
SmsMessage[] messages = new SmsMessage[objArray.length];
for (int i = 0; i < objArray.length; i++)
{
messages = SmsMessage.createFromPdu((byte[]) objArray);
}
// 將送來的短信合并自定義信息于StringBuilder當(dāng)中
for (SmsMessage currentMessage : messages)
{
sb.append("短信來源:");
// 獲得接收短信的電話號碼
sb.append(currentMessage.getDisplayOriginatingAddress());
sb.append("\n------短信內(nèi)容------\n");
// 獲得短信的內(nèi)容
sb.append(currentMessage.getDisplayMessageBody());
}
}
Intent mainIntent = new Intent(context, Main.class);
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
// 使用Toast信息提示框顯示接收到的短信內(nèi)容
Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
}
}
}
在編寫SMSReceiver
類時需要注意如下4
點(diǎn):
- 接收短信的Broadcast Action是android.provider.Telephony.SMS_RECEIVED,因此,要在onReceiver方法的開始部分判斷接收到的是否是接收短信的Broadcast Action。
- 需要通過Bundle.get("pdus")來獲得接收到的短信消息。這個方法返回了一個表示短信內(nèi)容的數(shù)組。每一個數(shù)組元素表示一條短信。這就意味著通過Bundle.get("pdus")可以返回多條系統(tǒng)接收到的短信內(nèi)容。
- 通過Bundle.get("pdus")返回的數(shù)組一般不能直接使用,需要使用SmsMessage.createFromPdu方法將這些數(shù)組元素轉(zhuǎn)換成SmsMessage對象才可以使用。每一個SmsMessage對象表示一條短信。
- 通過SmsMessage類的getDisplayOriginatingAddress方法可以獲得發(fā)送短信的電話號碼。通過getDisplayMessageBody方法可以獲得短信的內(nèi)容。
2.
在AndroidManifest.xml
文件中配置SMSReceiver
類,代碼如下:
<receiver android:name="SMSReceiver">
<intent-filter>
<!-- 指定SMSReceiver可以接收的Broadcast Action -->
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
為了使應(yīng)用程序可以成功地接收SMS_RECEIVED
廣播,還需要使用<uses-permission>
標(biāo)簽為應(yīng)用程序打開接收短信的權(quán)限,代碼如下:
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
現(xiàn)在啟動應(yīng)用程序,界面上會顯示“等待接收短信...
”的信息。那么這里還有一個問題。如果我們在模擬器上測試這個程序呢?
解決這個問題并不難,Android
模擬器不僅可以模擬程序的運(yùn)行,還可以模擬手機(jī)的很多動作,例如,發(fā)短信就是其中之一。要模擬手機(jī)的動作,仍然要求助于DDMS
透視圖。在DDMS
透視圖中有一個【Emulator Control
】視圖(如果DDMS
中沒有這個視圖,請讀者通過Eclipse
的【Window
】>
【Show View
】菜單項(xiàng)來顯示這個視圖)。在【Telephone Actions
】分組框,選中SMS
選項(xiàng)框,并在【Incomingnumber
】文本框中輸入一個電話號,然后在【Message
】文本框中輸入要發(fā)送的短信內(nèi)容,最后單擊【Send
】按鈕來模擬發(fā)送短信。輸入相應(yīng)信息后的【Emulator Control
】視圖如圖1所示。當(dāng)單擊【Send
】按鈕后,手機(jī)模擬器就會接收到短信,不管接收短信的應(yīng)用程序是否啟動,都會顯示如圖2
所示的顯示短信內(nèi)容的Toast
信息提示框。


新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining