Android之觀察者ContentObserver

我叫阿狸貓發表於2014-01-23
註冊觀察者

                 在應用程式中可以對內容提供者(ContentProvider)註冊一個觀察者(ContentObserver)

                 註冊觀察者的時候需要用到內容提供者的URI。

                 建立類繼承ContentObserver, 重寫onChange()方法
                 使用ContentResolver.registerContentObserver(Uri, boolean, ContentObServer)方法可以註冊, 傳入指定Uri, 是否監聽子級路徑, 和一個觀察者物件
                 在收到資料改變通知之後, 會自動執行onChange()方法
通知觀察者

                 註冊觀察者之後, 需要在ContentProvider內容提供者中進行通知, 觀察者才能收到, 使用ContentResolver.notifyChange()方法可以通知資料的改變


在應用中註冊某個內容提供者的觀察者

import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Uri uri = Uri.parse("content://com.xxc.test.provider");
		getContentResolver().registerContentObserver(uri, true, new MyContentObserver());//監聽指定uri(包括子集uri路徑)修改操作
        
    }
    
    private class MyContentObserver extends ContentObserver {

		public MyContentObserver() {
			super(new Handler());//Handler是一個處理器,目前沒有用到
		}
    	@Override
    	public void onChange(boolean selfChange) {//當ContentProvider中資料改變,就會執行該方法
    		ContentResolver resolver = getContentResolver();
    		Uri uri = Uri.parse("content://com.xxc.test.provider/person");
    		Cursor c = resolver.query(uri, null, null, null, "id DESC LIMIT 1");//查詢最後一條的資料
    		if(c.moveToNext()){
    			Toast.makeText(getApplicationContext(), c.getString(1)+"<--->"+c.getInt(2), Toast.LENGTH_SHORT).show();
    		}
    	}
    }
    
}

ContentProvider類中的insert方法新增通知觀察者的方法(其他方法一樣)

public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db = helper.getWritableDatabase();
		switch (matcher.match(uri)) {
		case PERSON:
			long id = db.insert("person","name,balance", values);//插入資料,返回id值得
			//通知觀察者資料已經進行了修改  引數二暫時先為null
			getContext().getContentResolver().notifyChange(uri, null);
			return ContentUris.withAppendedId(uri, id);//將id值跟在uri後返回
		default:
			throw new RuntimeException("Uri不能識別--->"+uri);
		}
	}


測試ContentProvider類

public void testInsert(){
	ContentResolver resolver = getContext().getContentResolver();
	Uri uri = Uri.parse("content://com.xxc.test.provider/person");
	ContentValues values = new ContentValues();
	values.put("name", "海闊天空");
	values.put("balance", 1000);
	uri = resolver.insert(uri, values);
	System.out.println(uri);
}



相關文章