您的位置:首页 > 其它

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

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

一、布局

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

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

<EditText
  android:id="@+id/verification_code"
  android:layout_width="100dp"
  android:layout_height="wrap_content"
  android:layout_marginLeft="10dp" />
<Button
  android:id="@+id/start"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="开启" />
<Button
  android:id="@+id/stop"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="停止" />
<TextView
  android:id="@+id/isStart"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginLeft="10dp"
  android:text="已开启"
  android:textColor="#FF0000"
  android:visibility="gone" />


二、BroadcastReceiver的认识

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

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

1、注册

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

1.代码指定:

<span style="font-size:18px;">IntentFilter filter = new IntentFilter();
	   filter.addAction("android.provider.Telephony.SMS_RECEIVED");
	   registerReceiver(smsReceiver, filter);</span>
2.在AndroidManifest.xml文件中配置:

<span style="font-size:18px;">           <receiver android:name=".smsReceiver" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
           </receiver></span>
我采用了第一种,那么我写了一个类继承BroadcastReceiver,然后在代码中指定了这个类。

2、触发

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

SendBroadcast:发送Normal Broadcast

SendOrderedBroadcast:发送 Ordered Broadcast

Ordered Broadcast比较有意思,会根据预先声明的优先级依次接受Broadrcast,级数,范围:-1000~1000,级数越大优先级越高(设置方式:1.在<intent-filter.../>元素的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,就能自动填充上~\(≧▽≦)/~啦啦啦

点击打开链接下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: