當前位置:名人名言大全網 - 短信平臺 - android內容觀察者有哪些

android內容觀察者有哪些

攔截短信,比如當發短信的時候,就把短信讀取出來,當系統的短信發生變化的時候,大叫壹聲,把數據發送到公***的消息郵箱裏面,我們的應用通過內容觀察者觀察公***的消息郵箱

獲取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;

}

這樣在每次點擊按鈕的時候,都會打印相關數據庫數據被修改的提示