1. ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理.
1)注冊ContentObserver方法
public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
功能:為指定的Uri注冊一個ContentObserver派生類實例,當給定的Uri發生改變時,回調該實例對象去處理。
uri表示需要觀察的Uri
notifyForDescendents 為false 表示精確匹配,即只匹配該Uri。 為true 表示可以同時匹配其派生的Uri。
2)取消注冊ContentObserver方法
public final void unregisterContentObserver(ContentObserver observer)
功能:取消對給定Uri的觀察
參數: observer ContentObserver的派生類實例
2.ContentObserver類介紹
構造方法 ContentObserver(Handler h)
void onChange(boolean selfChange) 功能:當觀察到的Uri發生變化時,回調該方法去處理。所有ContentObserver的派生類都需要重載該方法去處理邏輯。
3.觀察特定Uri的步驟如下:
1、創建我們特定的ContentObserver派生類,必須重載父類構造方法,必須重載onChange()方法去處理回調后的功能實現
2、利用context.getContentResolover()獲ContentResolover對象,接着調用registerContentObserver()方法去注冊內容觀察者
3、在不需要時,需要手動的調用 unregisterContentObserver()去取消注冊。
例子:監聽短信內容變化
在Activity中:
public class Day0108_contentobserverActivity extends Activity { private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 100: String body = (String) msg.obj; TextView tv = (TextView) findViewById(R.id.tv); tv.setText(body); break; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ContentResolver cr = getContentResolver(); ContentObserver smsObserver = new SmsContentObserver(this,handler); //第二個參數,true表示觀察所有有關短信的 cr.registerContentObserver(Uri.parse("content://sms"), true, smsObserver); //content://sms/inbox //收件箱 //content://sms/sent //已發送 //content://sms/draft //草稿箱 //content://sms/outbox //發件箱 //content://sms/failed //失敗短信 //content://sms/queued //代發隊列 } } //SmsContentObserver代碼如下: public class SmsContentObserver extends ContentObserver { private Handler handler; private Context context; public SmsContentObserver(Context context,Handler handler) { super(handler); this.handler = handler; this.context = context; } @Override public void onChange(boolean selfChange) { ContentResolver cr = context.getContentResolver(); Cursor c = cr.query(Uri.parse("content://sms/inbox"), null, "0", null, "date desc"); StringBuilder sb = new StringBuilder(); while(c.moveToNext()){ //發件人手機號碼 String sendNumber = c.getString( c.getColumnIndex("address")); //信息內容 String body = c.getString(c.getColumnIndex("body")); //readType 表示是否已經讀 int hasRead = c.getInt(c.getColumnIndex("read")); if(hasRead == 0){//表示短信未讀 System.out.println("短信未讀"+sendNumber); } sb.append(sendNumber+":"+body+"\n"); } handler.obtainMessage(100,sb.toString()).sendToTarget(); } }