转载时请注明转自:http://blog.csdn.net/sam_zhang1984

交流可加新浪微博:Android开发人

转自:http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=22235&highlight=

本文为《Android/OPhone开发完全讲义》一书的内容连载。转载请注明出处

短信是手机中经常使用到的一种服务。然而,当手机接收到短信时,也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么,那就需要接收这个系统广播。
接收系统广播的步骤我们已经熟悉了,下面就按步就班地来完成这两个步骤。
1.
编写一个 SMSReceiver类来接收系统广播。

package net.blogjava.mobile.sms; 02 03 import android.content.BroadcastReceiver; 04 import android.content.Context; 05 import android.content.Intent; 06 import android.os.Bundle; 07 import android.telephony.gsm.SmsMessage; 08 import android.widget.Toast; 09 10 public class SMSReceiver extends BroadcastReceiver 11 { 12 @Override 13 public void onReceive(Context context, Intent intent) 14 { 15 // 判断接收到的广播是否为收到短信的Broadcast Action 16 if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction())) 17 { 18 StringBuilder sb = new StringBuilder(); 19 // 接收由SMS传过来的数据 20 Bundle bundle = intent.getExtras(); 21 // 判断是否有数据 22 if (bundle != null) 23 { 24 // 通过pdus可以获得接收到的所有短信消息 25 Object[] objArray = (Object[]) bundle.get("pdus"); 26 // 构建短信对象array,并依据收到的对象长度来创建array的大小 27 SmsMessage[] messages = new SmsMessage[objArray.length]; 28 for (int i = 0; i < objArray.length; i++) 29 { 30 messages[i] = SmsMessage.createFromPdu((byte[]) objArray[i]); 31 } 32 // 将送来的短信合并自定义信息于StringBuilder当中 33 for (SmsMessage currentMessage : messages) 34 { 35 sb.append("短信来源:"); 36 // 获得接收短信的电话号码 37 sb.append(currentMessage.getDisplayOriginatingAddress()); 38 sb.append("/n------短信内容------/n"); 39 // 获得短信的内容 40 sb.append(currentMessage.getDisplayMessageBody()); 41 } 42 } 43 Intent mainIntent = new Intent(context, Main.class); 44 mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 45 context.startActivity(mainIntent); 46 // 使用Toast信息提示框显示接收到的短信内容 47 Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show(); 48 } 49 } 50 }

在编写 SMSReceiver类时需要注意如下 4点:

  • 接收短信的Broadcast Action是android.provider.Telephony.SMS_RECEIVED,因此,要在onReceiver方法的开始部分判断接收到的是否是接收短信的Broadcast Action。
  • 需要通过Bundle.get("pdus")来获得接收到的短信消息。这个方法返回了一个表示短信内容的数组。每一个数组元素表示一条短信。这就意味着通过Bundle.get("pdus")可以返回多条系统接收到的短信内容。
  • 通过Bundle.get("pdus")返回的数组一般不能直接使用,需要使用SmsMessage.createFromPdu方法将这些数组元素转换成SmsMessage对象才可以使用。每一个SmsMessage对象表示一条短信。
  • 通过SmsMessage类的getDisplayOriginatingAddress方法可以获得发送短信的电话号码。通过getDisplayMessageBody方法可以获得短信的内容。


2.
AndroidManifest.xml文件中配置 SMSReceiver类,代码如下:

1 <receiver android:name="SMSReceiver"> 2 <intent-filter> 3 <!-- 指定SMSReceiver可以接收的Broadcast Action --> 4 <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 5 </intent-filter> 6 </receiver>

为了使应用程序可以成功地接收 SMS_RECEIVED广播,还需要使用 <uses-permission>标签为应用程序打开接收短信的权限,代码如下:

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

现在启动应用程序,界面上会显示“等待接收短信 ...”的信息。那么这里还有一个问题。如果我们在模拟器上测试这个程序呢?
解决这个问题并不难, Android模拟器不仅可以模拟程序的运行,还可以模拟手机的很多动作,例如,发短信就是其中之一。要模拟手机的动作,仍然要求助于 DDMS透视图。在 DDMS透视图中有一个【 Emulator Control】视图(如果 DDMS中没有这个视图,请读者通过 Eclipse的【 Window > Show View】菜单项来显示这个视图)。在【 Telephone Actions】分组框,选中 SMS选项框,并在【 Incomingnumber】文本框中输入一个电话号,然后在【 Message】文本框中输入要发送的短信内容,最后单击【 Send】按钮来模拟发送短信。输入相应信息后的【 Emulator Control】视图如图1 所示。当单击【 Send】按钮后,手机模拟器就会接收到短信,不管接收短信的应用程序是否启动,都会显示如图 2所示的显示短信内容的 Toast信息提示框。

更多相关文章

  1. Android(安卓)之窗口小部件详解--App Widget
  2. Android中优雅的退出程序
  3. 关于android app跳转和从web跳转的问题(转载修正)
  4. 极光推送Android集成以及使用
  5. Android2.1 短信应用解析
  6. Mac 下Idea开发android项目,模拟发短信
  7. Android开发之BroadcastReceiver详解
  8. Android触发器组件BroadcastReceiver详解
  9. android使用广播退出应用程序

随机推荐

  1. MySQL 全文索引的原理与缺陷
  2. Windows系统下MySQL无法启动的万能解决方
  3. MySQL使用MRG_MyISAM(MERGE)实现分表后查
  4. mysql 8.0.22 zip压缩包版(免安装)下载、
  5. 最新版MySQL 8.0.22下载安装超详细教程(W
  6. Mysql8.0.22解压版安装教程(小白专用)
  7. Mysql事务特性和级别原理解析
  8. MySQL数据库锁机制原理解析
  9. mysql分页的limit参数简单示例
  10. 超详细MySQL8.0.22安装及配置教程