您好,登錄后才能下訂單哦!
Android 使用ContentObserver監(jiān)聽數(shù)據(jù)庫內(nèi)容是否更改
ContentObserver——內(nèi)容觀察者,目的是觀察(捕捉)特定Uri引起的數(shù)據(jù)庫的變化,繼而做一些相應(yīng)的處理,它類似于數(shù)據(jù)庫技術(shù)中的觸發(fā)器(Trigger),當(dāng)ContentObserver所觀察的Uri發(fā)生變化時,便會觸發(fā)它。觸發(fā)器分為表觸發(fā)器、行觸發(fā)器,相應(yīng)地ContentObserver也分為“表“ContentObserver、“行”ContentObserver,當(dāng)然這是與它所監(jiān)聽的Uri MIME Type有關(guān)的。熟悉Content Provider(內(nèi)容提供者)的應(yīng)該知道,我們可以通過UriMatcher類注冊不同類型的Uri,我們可以通過這些不同的Uri來查詢不同的結(jié)果。根據(jù)Uri返回的結(jié)果,Uri Type可以分為:返回多條數(shù)據(jù)的Uri、返回單條數(shù)據(jù)的Uri。
注冊/取消注冊ContentObserver方法,抽象類ContentResolver類中的方法原型如下:
public final void registerContentObserver ( Uri uri, boolean notifyForDescendents, ContentObserver observer )
功能:為指定的Uri注冊一個ContentObserver派生類實例,當(dāng)給定的Uri發(fā)生改變時,回調(diào)該實例對象去處理。
參數(shù):
uri 需要觀察的Uri(需要在UriMatcher里注冊,否則該Uri也沒有意義了)
notifyForDescendents 為false 表示精確匹配,即只匹配該Uri
觀察系統(tǒng)里短消息的數(shù)據(jù)庫變化的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; //用來觀察系統(tǒng)里短消息的數(shù)據(jù)庫變化 ”表“內(nèi)容觀察者,只要信息數(shù)據(jù)庫發(fā)生變化,都會觸發(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)聽的Uri發(fā)生改變時,就會回調(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ī)號碼: "+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,對短消息的觀察Uri,通過測試我發(fā)現(xiàn)只能監(jiān)聽此Uri “content://sms” (等于"content://sms/"),而不能監(jiān)聽其他的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); //注冊內(nèi)容觀察者 registerContentObservers() ; } private void registerContentObservers() { // ”表“內(nèi)容觀察者 ,通過測試我發(fā)現(xiàn)只能監(jiān)聽此Uri -----> content://sms // 監(jiān)聽不到其他的Uri 比如說 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的實例詳解,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。