我们使用的Android手机在收到短信的时候会发出一条系统广播。该条广播中存放着接收到的短信的详细信息。本文将详细介绍如何通过动态注册广播来监听短信。

注册广播有两种方式,一种是动态注册,另一种是静态注册。动态注册,顾名思义就是在程序运行时注册的,需要用到广播的时候就注册,用完即销毁。静态注是在AndroidManifest.xml中注册的,在<application>中使用<receiver>标签注册。

那么如何创建一个监听短信的广播接收器呢,其实只需要新建一个类,让这个类继承BroadcastReceiver,并重写父类的onReceiver方法就可以了。当有广播来了,onReceiver()方法就会执行。

首先创建一个ListenerSMSBroadcast项目。然后在MainActivity中修改添加代码。现在在MainActivity中创建一个SMSBroadcastReceiver类并继承BroadcastReceiver,然后重写onReceiver方法。

 class SMSBroadcastReceiver  extends BroadcastReceiver{

         @Override
public void onReceive(Context arg0, Intent intent) {

6 Object[] object=(Object[]) intent.getExtras().get("pdus");
StringBuilder sb=new StringBuilder();
for (Object pdus : object) {
byte[] pdusMsg=(byte[]) pdus;
SmsMessage sms=SmsMessage.createFromPdu(pdusMsg);
String mobile=sms.getOriginatingAddress();//发送短信的手机号
String content=sms.getMessageBody();//短信内容
//下面是获取短信的发送时间
Date date=new Date(sms.getTimestampMillis());
String date_time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
//追加到StringBuilder中
sb.append("短信发送号码:"+mobile+"\n短信内容:"+content+"\n发送时间:"+date_time+"\n\n");

}
Message msg=new Message();
msg.what=RECEIVERED_MSG;
msg.obj=sb.toString();
handler.sendMessage(msg);
} }

以上代码可以看到,SMSBroadcastReceiver类继承了BroadcastReceiver 而且重写了onReceive()方法。在onReceiver()方法中使用intent.getExtras().get("pdus")获取到了一个Object[]类型的数组,而且每一个Object都是byte类型的。然后使用for循环遍历数组,最后使用Handler将短信内容显示在activity中。

下面是动态注册广播。

private IntentFilter intentFilter;
private SMSBroadcastReceiver smsBroadcastReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_msg=(TextView) findViewById(R.id.tv_msg);
intentFilter=new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
smsBroadcastReceiver=new SMSBroadcastReceiver();
//动态注册广播
registerReceiver(smsBroadcastReceiver, intentFilter);
}

在这段代码中声明了一个IntentFilter对象,并给它添加了一个值为android.provider.Telephony.SMS_RECEIVED的action。为什么要给它添加这个值呢?因为当手机收到短信的时候系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这正是要监听的广播。接着就创建了一个SMSBroadcastReceiver实例。然后调用registerReceiver()方法注册广播,这里讲SMSBroadcastReceiver实例和IntentFilter实例都传进去,这样SMSBroadcastReceiver就会收到系统收到短信时发送的广播了。

注意,这里面读取短信,所以需要添加读取短信权限的。只要在AndroidManifest.xml中添加一些权限:

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

既然是动态注册广播接收器,一定要取消注册。取消注册需要调用unregisterReceiver()来实现。这里面是在onDestroy()方法中取消注册的。

     protected void onDestroy() {
super.onDestroy();
//取消注册广播
unregisterReceiver(smsBroadcastReceiver);
}

本文用到了Handler来修改页面中TextView的text的属性值得。message.what来判断是否要修改text的值,message.obj中是修改的值。

 private Handler handler=new Handler(){

         public void handleMessage(android.os.Message msg) {
if(msg.what==RECEIVERED_MSG)
{
tv_msg.setText("收到的信息:\n"+msg.obj);//\n表示换行
}
};
};

Android手机使用广播监听手机收到的短信的更多相关文章

  1. Android studio之广播监听接收短信

    一. 在清单文件中(AndroidManifest.xml)添加短信权限 这里我用的android studio版本是3.3的 <uses-permission android:name=&qu ...

  2. Android中定义广播监听,其他页面发送

    private LocalBroadcastManager broadcastManager; /** * 注册广播接收器 */ private void receiveAdDownload() { ...

  3. (转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案

    最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资 ...

  4. 使用BroadcastReceiver监听系统接收的短信

    import android.content.BroadcastReceiver;import android.content.Context;import android.content.Inten ...

  5. 使用ContentObserve监听用户发出的短信

    import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.app.Activit ...

  6. Android初级教程使用服务注册广播接收者监听手机解锁屏变化

    之前第七章广播与服务理论篇写到: 特殊的广播接收者(一般发广播次数频率很高) 安卓中有一些广播接收者,必须使用代码注册,清单文件注册是无效的 屏幕锁屏和解锁 电量改变 今天在这里就回顾一下,且用代码方 ...

  7. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  8. Android之——监听手机开机事件

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47028535 本文中,主要通过监听开机广播来达到监听手机开机状态的操作.在Andr ...

  9. 用BroadcastReceiver监听手机网络状态变化

    android--解决方案--用BroadcastReceiver监听手机网络状态变化 标签: android网络状态监听方案 2015-01-20 15:23 1294人阅读 评论(3) 收藏 举报 ...

随机推荐

  1. POJ - 2528 Mayor's posters(dfs+分治)

    POJ - 2528 Mayor's posters 思路:分治思想. 代码: #include<iostream> #include<cstdio> #include< ...

  2. 阿里官方Java代码规范标准

    阿里官方Java代码规范标准<阿里巴巴Java开发手册 终极版 v1.3.0>下载 https://www.cnblogs.com/han-1034683568/p/7680354.htm ...

  3. 网站链接facebook 拿新的post

    $http({ method: "GET", url: "https://graph.facebook.com/oauth/access_token?client_id= ...

  4. C#一套简单的单例系统

    单例基类 public class CSingletonBase<TYPE> { public static TYPE Singleton { get { return m_singlet ...

  5. 最大容积 Container With Most Water

    2018-07-31 17:28:42 问题描述: 问题求解: 很容易想到的是Brute Force,也就是枚举所有可能的pairs,这种解法的时间复杂度为O(n ^ 2),由于本题的数据规模较大,会 ...

  6. 20161227xlVBA多文件合并计算

    Sub NextSeven_CodeFrame() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAlerts = Fal ...

  7. (GoRails) 如何去掉form输入框头尾的空格;何时用callbacks,gem;

    视频:https://gorails.com/episodes/when-callbacks-and-adding-dependencies-are-good?autoplay=1 主题:应当在什么时 ...

  8. 『Numpy』常用方法记录

    numpy教程 防止输出省略号 import numpy as np np.set_printoptions(threshold=np.inf) 广播机制 numpy计算函数返回默认是一维行向量: i ...

  9. zabbix3.0.4 配置邮件报警

    试验环境: LAMP环境 (LNMP环境已经成功了,为了避免干扰,我另一台LAMP主机) ### 我在做实验之前,作了时间同步,不知道这个有木有影响,一起说一下吧! yum -y install nt ...

  10. JavaScript学习总结(一)——JavaScript基础

    一.JavaScript语言特点 1.1.JavaScript是基于对象和事件驱动的(动态的) 它可以直接对用户或客户输入做出响应,无须经过Web服务程序.它对用户的响应,是采用以事件驱动的方式进行的 ...