我们使用的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. Qt5.3.2(VS2010)_调试_查看变量值

    1.菜单栏 -->控件(W) --> 视图 2.在"Debug"状态下,选择一个变量(或者 按住左键 选择变量及其属性/方法)--> 右键 --> 添加表达 ...

  2. [ios]Xcode常用快捷键

    参考:http://www.linuxidc.com/Linux/2012-08/67905.htm Xcode常用快捷键 隐藏xcode command+h退出xcode command+q关闭窗口 ...

  3. 告诉maven,我真的不需要web.xml

    <!-- 告诉maven,我真的不需要web.xml --> <plugin> <groupId>org.apache.maven.plugins</grou ...

  4. 关于Dos命令中存在中文的解决方法

    问题:当我们直接打开dos窗口并在里面写入中文时是没有问题的,但是当我们把这些命令放在bat文件中执行时就出问题了解决:1.首先可以通过pause命令来查看错误原因2.记事本默认是UTF-8格式的,而 ...

  5. GitHub 中国区前 100 名到底是什么样的人?

    转一下CSDN的文章, 这里有些人挺厉害的. http://geek.csdn.net/news/detail/66000

  6. SVN同步版本库与网站目录2

    定义: SVN版本库  = /home/svn/repos  网站目录     = /var/www/web 1.检出一个项目到网站目录 #svn checkout file:///home/svn/ ...

  7. python打印ms

    ct打印的是时间戳,时间戳的小数点后前三位为ms  eg:1555644362.055328   ms = 055 import time ct = time.time() local_time = ...

  8. WPF 阴影效果

    WPF 阴影效果 制作WPF的阴影效果可以有很多种,貌似后来性能不好,然后被微软给X掉了.现在只有几个是可以用的,先暂时学习下现在有的,等以后看看用什么来代替原来的那些效果. 1.首先最常见的一个阴影 ...

  9. Garlands CodeForces - 707E (离线树状数组)

    大意: 给定n*m矩阵, k条链, 链上每个点有权值, 每次操作可以关闭或打开一条链或询问一个子矩阵内未关闭的权值和. 关键询问操作比较少, 可以枚举每条链, 暴力算出该条链对每个询问的贡献. 最后再 ...

  10. Bug in Code CodeForces - 420C (计数,图论)

    大意: 给定$n$结点无向图, 共n条边, 有重边无自环, 求有多少点对(u,v), 满足经过u和v的边数>=p 可以用双指针先求出所有$deg_u+deg_v \ge p$的点对, 但这样会多 ...