Android手机使用广播监听手机收到的短信
我们使用的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手机使用广播监听手机收到的短信的更多相关文章
- Android studio之广播监听接收短信
一. 在清单文件中(AndroidManifest.xml)添加短信权限 这里我用的android studio版本是3.3的 <uses-permission android:name=&qu ...
- Android中定义广播监听,其他页面发送
private LocalBroadcastManager broadcastManager; /** * 注册广播接收器 */ private void receiveAdDownload() { ...
- (转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案
最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资 ...
- 使用BroadcastReceiver监听系统接收的短信
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Inten ...
- 使用ContentObserve监听用户发出的短信
import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.app.Activit ...
- Android初级教程使用服务注册广播接收者监听手机解锁屏变化
之前第七章广播与服务理论篇写到: 特殊的广播接收者(一般发广播次数频率很高) 安卓中有一些广播接收者,必须使用代码注册,清单文件注册是无效的 屏幕锁屏和解锁 电量改变 今天在这里就回顾一下,且用代码方 ...
- Android监听手机网络变化
Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...
- Android之——监听手机开机事件
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47028535 本文中,主要通过监听开机广播来达到监听手机开机状态的操作.在Andr ...
- 用BroadcastReceiver监听手机网络状态变化
android--解决方案--用BroadcastReceiver监听手机网络状态变化 标签: android网络状态监听方案 2015-01-20 15:23 1294人阅读 评论(3) 收藏 举报 ...
随机推荐
- wireshark 下载
https://www.wireshark.org/download/win64/
- TeamViewer 说明截图
- android适配各种分辨率的问题
Android设备屏幕的尺寸是各式各样的,如小米是4英寸的,Xoom平板是10英寸:分辨率也千奇百怪,800×480,960×540等:Android版本的碎片化问题更是萦绕于心,不过在设计应用时可以 ...
- 将数组划分成连续子序列 Split Array into Consecutive Subsequences
2018-08-04 20:47:43 问题描述: 问题描述: 本题需要的是将一个数组划分成子序列,保证每个子序列是连续的,并且长度要大于等于3. 解题思路是使用贪心算法,首先对数组中的数字进行计数, ...
- Java 常用对象-Object类
2017-10-31 23:42:08 Object类:类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 或者说,每个类都直接或者间 ...
- m_Orchestrate learning system---三十一、模板和需求的关系
m_Orchestrate learning system---三十一.模板和需求的关系 一.总结 一句话总结:模板为了适应广大用户,有很多功能样式,但是,你需要的只是部分,所以删掉不需要的,如果有需 ...
- 20170617xlVBA调查问卷基础数据分类计数
Public Sub GatherDataPicker() Application.ScreenUpdating = False Application.DisplayAlerts = False A ...
- Edge coloring of bipartite graph CodeForces - 600F (二分图染色)
大意:给定二分图, 求将边染色, 使得任意邻接边不同色且使用颜色种类数最少 最少颜色数即为最大度数, 要输出方案的话, 对于每一条边(u,v), 求出u,v能使用的最小的颜色$t0$,$t1$ 若t0 ...
- Leha and another game about graph CodeForces - 840B (dfs)
链接 大意: 给定无向连通图, 每个点有权值$d_i$($-1\leq d_i \leq 1$), 求选择一个边的集合, 使得删除边集外的所有边后, $d_i$不为-1的点的度数模2等于权值 首先要注 ...
- gradle 编译 No such property: sonatypeUsername错误解决
No such property: sonatypeUsername for class: org.gradle.api.publication.maven.internal.ant.DefaultG ...