1. 程式人生 > >android之ContentObserver內容觀察者的使用

android之ContentObserver內容觀察者的使用

在跟著一個教程做手機衛士的時候,裡面用到了ContentObserver,以前沒接觸過,根據網上的資料整理了一下,還算明白。

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

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

(1)註冊:

    public final void  registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)。

     功能:為指定的Uri註冊一個ContentObserver派生類例項,當給定的Uri發生改變時,回撥該例項物件去處理。
 

(2)解除安裝:      public final void  unregisterContentObserver(ContentObserver observer)

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

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

首先是一個監聽類:

package jason.observer;

import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;

public class SMSContentObserver extends ContentObserver {

	Context context;
	Handler handler;

	public SMSContentObserver(Context c, Handler handler) {
		super(handler);
		// TODO Auto-generated constructor stub
		this.context = c;
		this.handler = handler;
	}

	@Override
	public void onChange(boolean selfChange) {
		// TODO Auto-generated method stub
		super.onChange(selfChange);
		Uri outMMS = Uri.parse("content://sms/inbox");
		//desc 降序	 asc 升序
		Cursor cursor = context.getContentResolver().query(outMMS, null, null, null, "date ASC");
		if(cursor != null){
			System.out.println("the number is " + cursor.getCount());
			StringBuilder  builder = new StringBuilder();
			while(cursor.moveToNext()){
				builder.append("發件人資訊:" + cursor.getString(cursor.getColumnIndex("address")));
				builder.append("資訊內容:"+cursor.getString(cursor.getColumnIndex("body"))+"\n");
			}
			cursor.close();
			String builder2 = builder.toString();
			handler.obtainMessage(1, builder2).sendToTarget();
		}
	}

}

(2)註冊監聽類的acitivity

package jason.observer;

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 {
	SMSContentObserver contentObserver;
	TextView tv_number;
	TextView tv_content;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_observer);
		tv_content = (TextView) findViewById(R.id.tv_content);
		tv_number = (TextView) findViewById(R.id.tv_number);
		contentObserver = new SMSContentObserver(this, handler);
		Uri uri = Uri.parse("content://sms");
		getContentResolver().registerContentObserver(uri, true, contentObserver);
	}

	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:
				String sb = (String) msg.obj;
				tv_content.setText(sb);
				break;

			default:
				break;
			}
		};	
	};

}

最後別忘記了加入 讀取訊息的許可權

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

作者:jason0539