Android 使用ContentObserver監(jiān)聽(tīng)數(shù)據(jù)庫(kù)內(nèi)容是否更改
Android 使用ContentObserver監(jiān)聽(tīng)數(shù)據(jù)庫(kù)內(nèi)容是否更改
ContentObserver——內(nèi)容觀察者,目的是觀察(捕捉)特定Uri引起的數(shù)據(jù)庫(kù)的變化,繼而做一些相應(yīng)的處理,它類似于數(shù)據(jù)庫(kù)技術(shù)中的觸發(fā)器(Trigger),當(dāng)ContentObserver所觀察的Uri發(fā)生變化時(shí),便會(huì)觸發(fā)它。觸發(fā)器分為表觸發(fā)器、行觸發(fā)器,相應(yīng)地ContentObserver也分為“表“ContentObserver、“行”ContentObserver,當(dāng)然這是與它所監(jiān)聽(tīng)的Uri MIME Type有關(guān)的。熟悉Content Provider(內(nèi)容提供者)的應(yīng)該知道,我們可以通過(guò)UriMatcher類注冊(cè)不同類型的Uri,我們可以通過(guò)這些不同的Uri來(lái)查詢不同的結(jié)果。根據(jù)Uri返回的結(jié)果,Uri Type可以分為:返回多條數(shù)據(jù)的Uri、返回單條數(shù)據(jù)的Uri。
注冊(cè)/取消注冊(cè)ContentObserver方法,抽象類ContentResolver類中的方法原型如下:
public final void registerContentObserver ( Uri uri, boolean notifyForDescendents, ContentObserver observer )
功能:為指定的Uri注冊(cè)一個(gè)ContentObserver派生類實(shí)例,當(dāng)給定的Uri發(fā)生改變時(shí),回調(diào)該實(shí)例對(duì)象去處理。
參數(shù):
uri 需要觀察的Uri(需要在UriMatcher里注冊(cè),否則該Uri也沒(méi)有意義了)
notifyForDescendents 為false 表示精確匹配,即只匹配該Uri
觀察系統(tǒng)里短消息的數(shù)據(jù)庫(kù)變化的ContentObserver派生類,SMSContentObserver.java
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
//用來(lái)觀察系統(tǒng)里短消息的數(shù)據(jù)庫(kù)變化 ”表“內(nèi)容觀察者,只要信息數(shù)據(jù)庫(kù)發(fā)生變化,都會(huì)觸發(fā)該ContentObserver 派生類
public class SMSContentObserver extends ContentObserver {
private static String TAG = "SMSContentObserver";
private int MSG_OUTBOXCONTENT = 2 ;
private Context mContext ;
private Handler mHandler ; //更新UI線程
public SMSContentObserver(Context context,Handler handler) {
super(handler);
mContext = context ;
mHandler = handler ;
}
/**
* 當(dāng)所監(jiān)聽(tīng)的Uri發(fā)生改變時(shí),就會(huì)回調(diào)此方法
*
* @param selfChange 此值意義不大 一般情況下該回調(diào)值false
*/
@Override
public void onChange(boolean selfChange){
Log.i(TAG, "the sms table has changed");
//查詢發(fā)件箱里的內(nèi)容
Uri outSMSUri = Uri.parse("content://sms/sent") ;
Cursor c = mContext.getContentResolver().query(outSMSUri, null, null, null,"date desc");
if(c != null){
Log.i(TAG, "the number of send is"+c.getCount()) ;
StringBuilder sb = new StringBuilder() ;
//循環(huán)遍歷
while(c.moveToNext()){
sb.append("發(fā)件人手機(jī)號(hào)碼: "+c.getInt(c.getColumnIndex("address")))
.append("信息內(nèi)容: "+c.getString(c.getColumnIndex("body")))
.append("\n");
}
c.close();
mHandler.obtainMessage(MSG_OUTBOXCONTENT, sb.toString()).sendToTarget();
}
}
}
主工程邏輯為MainActivity.java,對(duì)短消息的觀察Uri,通過(guò)測(cè)試我發(fā)現(xiàn)只能監(jiān)聽(tīng)此Uri “content://sms” (等于"content://sms/"),而不能監(jiān)聽(tīng)其他的Uri,比如"content://sms/outbox"等。
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.*;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tvAirplane;
private EditText etSmsoutbox;
private SMSContentObserver smsContentObserver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
etSmsoutbox = (EditText) findViewById(R.id.smsoutboxContent);
smsContentObserver = new SMSContentObserver(this, mHandler);
//注冊(cè)內(nèi)容觀察者
registerContentObservers() ;
}
private void registerContentObservers() {
// ”表“內(nèi)容觀察者 ,通過(guò)測(cè)試我發(fā)現(xiàn)只能監(jiān)聽(tīng)此Uri -----> content://sms
// 監(jiān)聽(tīng)不到其他的Uri 比如說(shuō) content://sms/outbox
Uri smsUri = Uri.parse("content://sms");
getContentResolver().registerContentObserver(smsUri, true,smsContentObserver);
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
String outbox = (String) msg.obj;
etSmsoutbox.setText(outbox);
}
}
};
}
以上就是Android 使用ContentObserver的實(shí)例詳解,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
android 調(diào)用系統(tǒng)的照相機(jī)和圖庫(kù)實(shí)例詳解
android手機(jī)有自帶的照相機(jī)和圖庫(kù),我們做的項(xiàng)目中有時(shí)用到上傳圖片到服務(wù)器,今天做了一個(gè)項(xiàng)目用到這個(gè)功能,所以把我的代碼記錄下來(lái)和大家分享,有需求的朋友可以參考下2012-12-12
Dcloud的native.js直接撥打電話Android實(shí)例代碼
本文為大家分享了3種利用Dcloud的native.js直接撥打電話實(shí)例代碼,由于iOS系統(tǒng)的限制所以只有Android版實(shí)例2018-09-09
Android省市區(qū)三級(jí)聯(lián)動(dòng)控件使用方法實(shí)例講解
最近有需求需要實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng),但是發(fā)現(xiàn)之前的實(shí)現(xiàn)不夠靈活,自己做了一些優(yōu)化。下面通過(guò)實(shí)例代碼給大家介紹下Android省市區(qū)三級(jí)聯(lián)動(dòng)控件使用方法2017-01-01
Android編程實(shí)現(xiàn)讀取手機(jī)聯(lián)系人、撥號(hào)、發(fā)送短信及長(zhǎng)按菜單操作方法實(shí)例小結(jié)
這篇文章主要介紹了Android編程實(shí)現(xiàn)讀取手機(jī)聯(lián)系人、撥號(hào)、發(fā)送短信及長(zhǎng)按菜單操作方法,以完整實(shí)例形式總結(jié)分析了Android編程實(shí)現(xiàn)讀取手機(jī)聯(lián)系人、撥號(hào)、發(fā)送短信及長(zhǎng)按菜單等操作的相關(guān)技巧,需要的朋友可以參考下2015-10-10
Android 中動(dòng)態(tài)加載.jar的實(shí)現(xiàn)步驟
本文介紹動(dòng)態(tài)加載 .jar的實(shí)現(xiàn)步驟,這將對(duì)你的android開(kāi)發(fā)很有幫助,剛興趣的朋友可以了解下哦2013-01-01
懸浮對(duì)話框Android代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了懸浮對(duì)話框Android代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
Android使用ViewPager實(shí)現(xiàn)無(wú)限滑動(dòng)效果
相信在大家開(kāi)發(fā)Android的時(shí)候,我們常常用ViewPager來(lái)為自己的應(yīng)用創(chuàng)建廣告條幅,并且常常會(huì)遇到ViewPager無(wú)限滑動(dòng)這樣的需求。下面來(lái)一起看看吧。2016-09-09
Android四種數(shù)據(jù)存儲(chǔ)的應(yīng)用方式
這篇文章主要介紹了Android四種數(shù)據(jù)存儲(chǔ)的應(yīng)用方式的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握Android存儲(chǔ)數(shù)據(jù)的方法,需要的朋友可以參考下2017-10-10

