Android⼿机使⽤⼴播监听⼿机收到的短信
我们使⽤的Android⼿机在收到短信的时候会发出⼀条系统⼴播。该条⼴播中存放着接收到的短信的详细信息。本⽂将详细介绍如何通过动态注册⼴播来监听短信。
注册⼴播有两种⽅式,⼀种是动态注册,另⼀种是静态注册。动态注册,顾名思义就是在程序运⾏时注册的,需要⽤到⼴播的时候就注册,⽤完即销毁。静态注是在l中注册的,在<application>中使⽤<receiver>标签注册。
那么如何创建⼀个监听短信的⼴播接收器呢,其实只需要新建⼀个类,让这个类继承BroadcastReceiver,并重写⽗类的onReceiver⽅法就可以了。当有⼴播来了,onReceiver()⽅法就会执⾏。
⾸先创建⼀个ListenerSMSBroadcast项⽬。然后在MainActivity中修改添加代码。现在在MainActivity中创建⼀个SMSBroadcastReceiver类并继承BroadcastReceiver,然后重写onReceiver⽅法。
1class SMSBroadcastReceiver  extends BroadcastReceiver{
2
3        @Override
4public void onReceive(Context arg0, Intent intent) {
5
6            Object[] object=(Object[]) Extras().get("pdus");
7            StringBuilder sb=new StringBuilder();
8for (Object pdus : object) {
9byte[] pdusMsg=(byte[]) pdus;
10                SmsMessage ateFromPdu(pdusMsg);
11                String OriginatingAddress();//的⼿机号
12                String MessageBody();//短信内容
13//下⾯是获取短信的发送时间安卓intent用法
14                Date date=new TimestampMillis());
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.String();
23            handler.sendMessage(msg);
24        }
25
26    }
以上代码可以看到,SMSBroadcastReceiver类继承了BroadcastReceiver ⽽且重写了onReceive()⽅法。在onReceiver()⽅法中使⽤Extras().get("pdus")获取到了⼀个Object[]类型的数组,⽽且每⼀个Object都是byte类型的。然后使⽤for循环遍历数组,最后使⽤Handler将短信内容显⽰在activity中。
下⾯是动态注册⼴播。
private IntentFilter intentFilter;
private SMSBroadcastReceiver smsBroadcastReceiver;
@Override
protected void onCreate(Bundle 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就会收到系统收到短信时发送的⼴播了。
注意,这⾥⾯读取短信,所以需要添加读取短信权限的。只要在l中添加⼀些权限:
1<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
既然是动态注册⼴播接收器,⼀定要取消注册。取消注册需要调⽤unregisterReceiver()来实现。这⾥⾯是在onDestroy()⽅法中取消注册的。
1protected void onDestroy() {
3//取消注册⼴播
4        unregisterReceiver(smsBroadcastReceiver);
5    }
本⽂⽤到了Handler来修改页⾯中TextView的text的属性值得。message.what来判断是否要修改text的值,message.obj中是修改的值。1private Handler handler=new Handler(){
2
3public void handleMessage(android.os.Message msg) {
4if(msg.what==RECEIVERED_MSG)
5            {
6                tv_msg.setText("收到的信息:\n"+msg.obj);//\n表⽰换⾏
7            }
8        };
9    };

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。