我们使用的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 };