《Android/OPhone开发完全讲义》连载(8):收到短信了,我该做点什么?

简介:
文为《And roid/OPhone开发完全讲义》一书的内容连载。转载请注明出处

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

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传过来的数据
            Bundle bundle = intent.getExtras();
             //  判断是否有数据
             if (bundle !=  null)
            {
                 //   通过pdus可以获得接收到的所有短信消息
                Object[] objArray = (Object[]) bundle.get("pdus");
                 //   构建短信对象array,并依据收到的对象长度来创建array的大小
                SmsMessage[] messages =  new SmsMessage[objArray.length];
                 for ( int i = 0; i < objArray.length; i++)
                {
                    messages = SmsMessage.createFromPdu(( byte[]) objArray);
                }
                 //   将送来的短信合并自定义信息于StringBuilder当中
                 for (SmsMessage currentMessage : messages)
                {
                    sb.append("短信来源:");
                     //  获得接收短信的电话号码
                    sb.append(currentMessage.getDisplayOriginatingAddress());
                    sb.append("\n------短信内容------\n");
                     //  获得短信的内容
                    sb.append(currentMessage.getDisplayMessageBody());
                }
            }
            Intent mainIntent =  new Intent(context, Main. class);
            mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            
            context.startActivity(mainIntent);
             //   使用Toast信息提示框显示接收到的短信内容
            Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
        }
    }
}

在编写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类,代码如下:

< receiver  android:name ="SMSReceiver" >            
     < intent-filter >
         <!--   指定SMSReceiver可以接收的Broadcast Action   -->
         < action  android:name ="android.provider.Telephony.SMS_RECEIVED"  />
     </ intent-filter >
</ 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信息提示框。




本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2010/09/14/1825902.html如需转载请自行联系原作者


银河使者

相关文章
|
5天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
21 5
|
4天前
|
设计模式 IDE Java
探索安卓开发:从新手到专家的旅程
【10月更文挑战第22天】 在数字时代的浪潮中,移动应用开发如同一座金矿,吸引着无数探险者。本文将作为你的指南针,指引你进入安卓开发的广阔天地。我们将一起揭开安卓平台的神秘面纱,从搭建开发环境到掌握核心概念,再到深入理解安卓架构。无论你是初涉编程的新手,还是渴望进阶的开发者,这段旅程都将为你带来宝贵的知识和经验的财富。让我们开始吧!
|
21天前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件基础与进阶
【10月更文挑战第5天】在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将通过浅显易懂的语言和实例,引导你了解自定义控件的基本概念、创建流程以及高级应用技巧,帮助你在开发过程中更好地掌握自定义控件的使用和优化。
27 10
|
13天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
52 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
21天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
4天前
|
搜索推荐 Android开发 UED
安卓开发中的自定义视图:打造个性化用户界面
【10月更文挑战第22天】在安卓应用的海洋中,如何让你的应用脱颖而出?一个独特且直观的用户界面(UI)至关重要。本文将引导你通过自定义视图来打造个性化的用户体验,从基础的视图绘制到触摸事件的处理,我们将一步步深入探讨。准备好了吗?让我们开始吧!
|
4天前
|
Android开发
我是一位Android工程师,用通义灵码的AS插件做开发工作助手,对比之前没有灵码,现在提效了60%
我是一位Android工程师,用通义灵码的AS插件做开发工作助手,对比之前没有灵码,现在提效了60%
15 0
|
17天前
|
消息中间件 存储 前端开发
资深Android开发的5个经典面试题
本文首发于公众号“AntDream”,欢迎关注。文章详细解答了五个常见的Android面试题,涵盖内存泄漏与溢出、Binder机制、MVC/MVP/MVVM架构、Handler机制及Context对象等内容,帮助读者深入了解Android开发的核心概念。
22 0
|
18天前
|
存储 安全 Android开发
探索Android开发之旅:从新手到专家的蜕变之路
【10月更文挑战第8天】在这篇文章中,我们将共同踏上一段激动人心的旅程,深入探索Android开发的奥秘。无论你是初涉编程世界的新手,还是渴望提升技能的开发者,这里都有你需要的知识与启示。通过简洁明了的语言和实际案例,我们将一起解锁Android开发的核心概念、掌握关键技能,并最终实现从新手到专家的华丽转变。
|
19天前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
16 0