BroadcastReceiver之系统的有序短信广播--手机验证码短信的自动填充

       最近在使用手机的时候,发现一个有趣的功能,在一些需要手机短信验证码,进行身份验证时,发现发来的短信,自己就填充到了输入框,觉得这是个不错的功能,比较方便~所以,就研究下怎么实现。

一、布局

       我写了个例子,布局比较简单,就一个页面:

       一个验证码的填充框,一2个按钮,控制开启监听广播,和关闭,一个TextView显示监听广播状态是否开启


二、BroadcastReceiver的认识

       整个功能的实现,其实还是比较简单的,其实就是监听系统的短信广播,然后进行处理。正好对BraodcastReceiver进行一次认识和整理。

       对于BroadcastReceiver,起先看到介绍说是什么全局的监听器呀,什么用于监听系统全局的广播消息,比较闹心,云里雾里的。后来,我把它和点击事件OnClickListener归为一类比较来理解,相当于一个特殊的点击事件。

       1、注册

       点击事件,不是得先setOnClickListener(OnClickListener l)注册,所以BroadcastReceiver,也得先注册,而且有2种方法:

       1.代码指定:

                IntentFilter filter = new IntentFilter();
	   filter.addAction("android.provider.Telephony.SMS_RECEIVED");
	   registerReceiver(smsReceiver, filter);
           2.在AndroidManifest.xml文件中配置:

           
            
                
            
           
我采用了第一种,那么我写了一个类继承 BroadcastReceiver,然后在代码中指定了这个类

       2、触发

       当注册了点击事件后,触发的方式就是去点击这个组件,那么BroadcastReceiver的触发方式,就是发送一个广播,广播分为2种:一种是普通的广播,一种是有序的广播,针对这两种广播,发送的方式不一样

       SendBroadcast:发送Normal Broadcast

       SendOrderedBroadcast:发送 Ordered Broadcast

       Ordered Broadcast比较有意思,会根据预先声明的优先级依次接受Broadrcast,级数,范围:-1000~1000,级数越大优先级越高(设置方式:1.在元素的android:priority属性设置。2.调用IntentFilter的setPriority方法进行设置)。前一个先收到广播的接收者,可以调用BroadcastReceiver的abortBroadcast()方法终止Broadcast,而后面的接受者将收不到,也可以通过setResultExtras(Bundle)方法将得到Broadcast后的处理结果存入到Broadcast,传给下一个接受者(下一个接受者可以通过getResultExtras(true)获取)。

监听手机短信的是系统的广播,是一个有序的广播,所以我在例子中得加上:

filter.setPriority(800);

     3、实现和处理

     最后贴上BroadcastReceiver的实现

public class SmsReceiver extends BroadcastReceiver {
	public static AutoFillListener autoFillListener;

	public void onReceive(Context context, Intent intent) {
		if (intent.getAction()
				.equals("android.provider.Telephony.SMS_RECEIVED"))
		// 如果收到系统的短信广播
		{
			// 接收由SMS传过来的数据
			StringBuilder sb = new StringBuilder();
			Bundle bundle = intent.getExtras();
			// 判断是否有数据
			if (bundle != null) {
				// 通过pdus可以获得接收到的所有短信消息
				Object[] pdus = (Object[]) bundle.get("pdus");
				// 构建短信对象array,并依据收到的对象长度来创建array的大小
				SmsMessage[] messages = new SmsMessage[pdus.length];
				for (int i = 0; i < pdus.length; i++) {
					messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
				}
				// 将送来的短信合并自定义信息于StringBuilder当中
				for (SmsMessage message : messages) {
					sb.append(message.getDisplayMessageBody());
				}
				autoFillListener.autofill(sb.toString().substring(4, 8));
			}
		}
	}

	public static interface AutoFillListener {
		public abstract void autofill(String code);
	}

必须实现,onReceive这个方法,里面是对收到内容的处理,填充上就OK啦~附上源码。点击开始,发送短信:验证码:XXXX,就能自动填充上~\(≧▽≦)/~啦啦啦

点击打开链接下载


你可能感兴趣的:(Android学习杂记,android,验证码,短信,broadcast)