Android 中的內容觀察者ContentObserver

    ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理,它類似於

   數據庫技術中的觸發器(Trigger),當ContentObserver所觀察的Uri發生變化時,便會觸發它。

使用ContentObserver 的時候2個重要方法。

(1)註冊:    public final void  registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)。

     功能:爲指定的Uri註冊一個ContentObserver派生類實例,當給定的Uri發生改變時,回調該實例對象去處理。

(2)卸載:  public final void  unregisterContentObserver(ContentObserver observer)(2)卸載:

          功能:取消對給定Uri的觀察

下面是一個監聽發信箱的Demo

首先是一個監聽類:

       

package com.bsn.test;

import java.net.URI;
import java.net.URL;

import android.app.Activity;
import android.content.ContentProvider;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

public class SMSContentObserver extends ContentObserver {
private Context mContext;
private Handler mhandler;
	public SMSContentObserver(Context context,Handler handler) {
		super(handler);
      mContext=context;
	  mhandler=handler;
	}
   @Override
	public void onChange(boolean selfChange) {
		super.onChange(selfChange);
		Uri outMMS=Uri.parse("content://sms/sent");
		Cursor c=mContext.getContentResolver().query(outMMS, null,null, null, "date desc");
	 if (c!=null) {
		 System.out.println("the number is----"+c.getCount());
		StringBuilder sb=new StringBuilder();
		while (c.moveToNext()) {
        sb.append("發件人手機號"+c.getInt(c.getColumnIndex("address")));
        sb.append("信息內容"+c.getString(c.getColumnIndex("body")));
		}
		c.close();
		mhandler.obtainMessage(2,sb.toString()).sendToTarget();
	}
	}
}
 (2)註冊監聽類的acitivity

      

package com.bsn.test;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class ObserverActivity extends Activity{
	private SMSContentObserver observer;
	private TextView numView;
	private TextView contentView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	setContentView(R.layout.dotsaygan);
	observer=new SMSContentObserver(this, mHandler);
	numView=(TextView) findViewById(R.id.tv);
	contentView=(TextView) findViewById(R.id.tv1);
	registerContentObservers();
	}
	private void registerContentObservers() {
     Uri uri=Uri.parse("content://sms");
     getContentResolver().registerContentObserver(uri, true, observer);
	}
private Handler mHandler=new Handler(){
	public void handleMessage(android.os.Message msg) {
		switch (msg.what) {
		case 2:
			String outbox=(String)msg.obj;
			contentView.setText(outbox);
			break;

		default:
			break;
		}
	}
};
}
最後別忘記了加入 讀取消息的權限

   <uses-permission android:name="android.permission.READ_SMS"/>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章