Android手机使用广播监听手机收到的短信

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

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

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

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

 1 class SMSBroadcastReceiver  extends BroadcastReceiver{
 2 
 3         @Override
 4         public void onReceive(Context arg0, Intent intent) {
 5             
6
Object[] object=(Object[]) intent.getExtras().get("pdus"); 7 StringBuilder sb=new StringBuilder(); 8 for (Object pdus : object) { 9 byte[] pdusMsg=(byte[]) pdus; 10 SmsMessage sms=SmsMessage.createFromPdu(pdusMsg); 11 String mobile=sms.getOriginatingAddress();//发送短信的手机号 12 String content=sms.getMessageBody();//短信内容 13 //下面是获取短信的发送时间 14 Date date=new Date(sms.getTimestampMillis()); 15 String date_time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); 16 //追加到StringBuilder中 17 sb.append("短信发送号码:"+mobile+"\n短信内容:"+content+"\n发送时间:"+date_time+"\n\n"); 18
19 } 20 Message msg=new Message(); 21 msg.what=RECEIVERED_MSG; 22 msg.obj=sb.toString(); 23 handler.sendMessage(msg); 24 } 25 26 }

以上代码可以看到,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中添加一些权限:

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

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

1     protected void onDestroy() {
2         super.onDestroy();
3         //取消注册广播
4         unregisterReceiver(smsBroadcastReceiver);
5     }

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

1 private Handler handler=new Handler(){
2         
3         public void handleMessage(android.os.Message msg) {
4             if(msg.what==RECEIVERED_MSG)
5             {
6                 tv_msg.setText("收到的信息:\n"+msg.obj);//\n表示换行
7             }
8         };
9     };

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。