Android设计模式之观察者模式( 二 )


文章插图
【Android设计模式之观察者模式】

Android设计模式之观察者模式

文章插图

Android设计模式之观察者模式

文章插图

Android设计模式之观察者模式

文章插图

Android设计模式之观察者模式

文章插图
源码下载地址:
下面我们展示一个在应用开发中应用观察者模式的实例:
项目开发实战:短信验证码自动填写
Android设计模式之观察者模式

文章插图
观察特定Uri的步骤如下: 创建我们特定的派生类,必须重载父类构造方法,必须重载 () 方法去处理回调后的功能实现 。利用 .() 获得对象,接着调用 ver() 方法去注册内容观察者 。由于的生命周期不同步于和等,因此,在不需要时,需要手动的调用 erver() 去取消注册 。.java
package com.shijiacheng.verificationcode;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;import android.util.Log;public class SmsObserver extends ContentObserver {private Context mContext;private Handler mHandler;public SmsObserver(Context context, Handler handler) {super(handler);mContext = context;mHandler = handler;}/*** 接收到短信时调用此方法*/@Overridepublic void onChange(boolean selfChange, Uri uri) {super.onChange(selfChange, uri);Log.d("DEBUG", "SMS has changed!");Log.d("DEBUG", uri.toString());if (uri.toString().equals("content://sms/raw")) {return;}Uri inboxUri = Uri.parse("content://sms/inbox");Cursor cursor = mContext.getContentResolver().query(inboxUri, null,null, null, "date desc");if (cursor != null) {if (cursor.moveToFirst()) {String address = cursor.getString(cursor.getColumnIndex("address"));String body = cursor.getString(cursor.getColumnIndex("body"));Log.d("DEBUG", "发件人为:" + address + " " + "短信内容为:" + body);// if (!address.equals("你的公司的手机号")) {// return;// }Pattern pattern = Pattern.compile("(\\d{6})");//正则表达式Matcher matcher = pattern.matcher(body);if (matcher.find()) {String code = matcher.group(0);Log.d("DEBUG", "code is" + code);mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE, code).sendToTarget();}}}}}
.java
package com.shijiacheng.verificationcode;import android.app.Activity;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.widget.EditText;public class MainActivity extends Activity {public static final int MSG_RECEIVED_CODE = 1;private EditText etVerficationCode;private SmsObserver mObserver;private Handler mHandler = new Handler() {public void handleMessage(android.os.Message msg) {if (msg.what == MSG_RECEIVED_CODE) {String code = (String) msg.obj;etVerficationCode.setText(code);}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etVerficationCode = (EditText) findViewById(R.id.et_verification_code);mObserver = new SmsObserver(MainActivity.this, mHandler);Uri uri = Uri.parse("content://sms");getContentResolver().registerContentObserver(uri, true, mObserver);}@Overrideprotected void onPause() {super.onPause();getContentResolver().unregisterContentObserver(mObserver);}}
源码下载地址:
这是我最近在公司项目中接触到的观察者模式的一点心得,能力有限,可能存在错误和不足的地方,欢迎大家指正,希望我的经验能够帮到你 。