獲取ContentResolver對象,調用函數getContentResolver(),
調用ContentResolver對象的
registerContentObserver(uri,notifyForDescendents,observer)方法,參數:Uri對象,是否
精確uri(true不精確,false精確),observer對象 ContentObserver對象
因為ContentObserver是抽象類,因此我們寫壹個內部類來繼承這個抽象類,必須實現構造函數,構造函數的Handler對象消息處理器
稍後會講,定義壹個內部類MyObserver,實現父類的onChange()回調方法,觀察到消息郵箱發生變化的時候會回調這個方法。
在這個回調函數裏面,使用獲取到短信內容,取最後壹條,調用Cursor對象的moveToFirst()指針指向最後壹條
系統應用是如何發出這個叫聲的呢,獲取ContentResolver對象,通過getContentResolver()方法,調用
ContentResolver對象的notifyChange(uri,observer)方法,參數:uri隨便定義,observer指定誰處理默
認null
系統的很多應用進行通知通信都是通過這個公***消息郵箱機制來實現的
接下來實戰壹下,接著《Android 內容提供者的實現》中使用的項目作為基礎,新建壹個項目,並添加代碼如下:
package com.wuyudong.observer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.view.Menu;
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.wuyudong.db.personprovider/");
getContentResolver().registerContentObserver(uri, true,
new MyObserver(new Handler()));
}
private class MyObserver extends ContentObserver {
public MyObserver(Handler handler) { // handler 是壹個消息處理器
super(handler);
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
System.out.println("haha,數據庫的內容變化了!!!");
super.onChange(selfChange);
}
}
}
並修改PersonDBProvider.java中的代碼:
public Uri insert(Uri uri, ContentValues values) {
if (matcher.match(uri) == INSERT) {
// 返回查詢的結果集
SQLiteDatabase db = helper.getWritableDatabase();
db.insert("person", null, values);
getContext().getContentResolver().notifyChange(uri, null);
} else {
throw new IllegalArgumentException("路徑不匹配,不能執行插入操作");
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
if (matcher.match(uri) == DELETE) {
// 返回查詢的結果集
SQLiteDatabase db = helper.getWritableDatabase();
int result = db.delete("person", selection, selectionArgs);
db.close();
if (result > 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
} else {
throw new IllegalArgumentException("路徑不匹配,不能執行刪除操作");
}
return 0;
}
這樣在每次點擊按鈕的時候,都會打印相關數據庫數據被修改的提示