/**
*
* 转载请标明出处:http://blog.csdn.net/u013598111/article/details/50312345
* @author:【JunTao_sun】
*
*
*/
观察者模式是软件设计模式中的一种,在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。
这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
观察者模式(Observer)完美的将观察者和被观察的对象分离开,在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
观察者
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察
被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
ContentObserver
内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。
package com.example.contentwhat;
import android.app.Activity;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class MainActivity extends Activity {
public static final int MSG_RECEIVED_CODE = 1;
private EditText edit = null;
private MyObserver mObserver;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == MSG_RECEIVED_CODE) {
String code = (String)msg.obj;
edit.setText(code);
}
}
};
protected void onPause() {
getContentResolver().unregisterContentObserver(mObserver);
}
;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText)findViewById(R.id.edit);
mObserver = new MyObserver(MainActivity.this, mHandler);
Uri uri = Uri.parse("content://sms");
//第二个参数: 是否监听对应服务所有URI监听 例如sms 所有uri
getContentResolver().registerContentObserver(uri, true, mObserver);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
public class MyObserver extends ContentObserver {
private Context mContext;
private Handler mHandler;
public MyObserver(Context context, Handler handler) {
super(handler);
mContext = context;
mHandler = handler;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
String code = "";
// 第一遍 先执行content://sms/raw 第二遍则 uri.toString :content://sms/inbox
if (uri.toString().equals("content://sms/raw")) {
return;
}
Uri inboxUri = Uri.parse("content://sms/inbox");
Cursor c = mContext.getContentResolver().query(inboxUri, null, null,
null, "date desc"); //按日期【排序 最后条记录应该在最上面 desc 从大到小 asc小到大
if (c != null) {
if (c.moveToFirst()) {
String address = c.getString(c.getColumnIndex("address"));
String body = c.getString(c.getColumnIndex("body"));
// if (!address.equals("15555215554")) {
// return; 判断是否是 来自 再提取验证码
// }
Pattern pattern = Pattern.compile("(\\d{6})");
Matcher matcher = pattern.matcher(body);
if (matcher.find()) {
code = matcher.group();
mHandler.obtainMessage(MainActivity.MSG_RECEIVED_CODE, code)
.sendToTarget();
}
}
c.close();
}
}