Android使用ContentObserver監(jiān)聽(tīng)數(shù)據(jù)庫(kù)內(nèi)容是否更改

Android 使用ContentObserver監(jiān)聽(tīng)數(shù)據(jù)庫(kù)內(nèi)容是否更改

創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)提供蕭縣企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、HTML5、小程序制作等業(yè)務(wù)。10年已為蕭縣眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

ContentObserver——內(nèi)容觀察者,目的是觀察(捕捉)特定Uri引起的數(shù)據(jù)庫(kù)的變化,繼而做一些相應(yīng)的處理,它類(lèi)似于數(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類(lèi)注冊(cè)不同類(lèi)型的Uri,我們可以通過(guò)這些不同的Uri來(lái)查詢不同的結(jié)果。根據(jù)Uri返回的結(jié)果,Uri Type可以分為:返回多條數(shù)據(jù)的Uri、返回單條數(shù)據(jù)的Uri。

注冊(cè)/取消注冊(cè)ContentObserver方法,抽象類(lèi)ContentResolver類(lèi)中的方法原型如下:

public final void registerContentObserver
(
Uri uri, boolean notifyForDescendents, ContentObserver observer
)

功能:為指定的Uri注冊(cè)一個(gè)ContentObserver派生類(lèi)實(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派生類(lèi),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 派生類(lèi) 
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ì)本站的支持!

網(wǎng)頁(yè)標(biāo)題:Android使用ContentObserver監(jiān)聽(tīng)數(shù)據(jù)庫(kù)內(nèi)容是否更改
文章轉(zhuǎn)載:http://muchs.cn/article44/jpejhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、品牌網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、服務(wù)器托管、面包屑導(dǎo)航關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)