2013-09-30 86 views
0

有沒有方法可以說明爲什麼觸發ContentObserver?例如,如果我通過「content:// sms」URI監控SMS併發送或接收SMS,是否有方法可以在ContentObserver類中推斷SMS類型是什麼(我知道我可以設置N ContentObservers,指定不同的URI,但我希望有一種方法可以告訴ContentObserver類)?從ContentObserver獲取觸發器

獎金:另外還有一個有趣的細微之處:

的第二個方法只能從API級別16日起,這樣的代碼不應該依賴於一個URI才能正常工作。

ContentObserver:

ContentResolver contentResolver = getBaseContext().getContentResolver(); 
contentResolver.registerContentObserver(Uri.parse("content://sms"), true, 
        new MessageObserver(new Handler(), getBaseContext())); 

ContentObserver類:

class SMSObserver extends ContentObserver {  
    public MyObserver(Handler handler) { 
     super(handler);   
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     this.onChange(selfChange, null); 
     // What SMS type caused this to trigger???????? 

    }   

    @Override 
    public void onChange(boolean selfChange, Uri uri) { 
     // What SMS type caused this to trigger???????? 
    }   
} 

回答

0

看你會收到平變化在下文提到的情況下

  1. 如果任何syncadapter是在該數據庫活動的,那麼它將觸發onchange每次它從同步,在這種情況下,你可能會收到onchange,即使沒有其實已經改變
  2. 如果數據集中存在操作改變。

現在要弄清楚已更改的數據,爲每個可能的URI設置觀察者並不是一個好主意,儘管如此,儘管可以檢測更新或刪除場景,但感測新插入將會成爲問題。我會建議你以下

保持一個觀察者,在初始化時您可以處理這是即時拍攝最初的整個數據,保持remebering COLUMN_ID,update_timestamp和總行數一旦你向前發展,當平變化下一次配Coulmn_Id,update_timestamp和你可以找出發生的變化

- >查找任何行column_id大於你記得,如果它返回任何行,那麼肯定會插入一些新行,你可以專門查詢它們 - >如果上面的條件失敗,那麼你需要查找update_timespamp任何更大的事情,然後你會記住會告訴是否有關更新的行 - >如果上述兩個cirteria f然後查找可能會告訴您有關刪除操作的計數差異。

如果以上都不存在,顯然它沒什麼,只是忽略onchange信號。希望能幫助到你。