2012/06/15

Android:ContentObserverにonChangeが通知される基準


ContentObserverにonChange通知される基準について調査しました。

結果、
 登録したURIへのnotifyChangeに加えて、親パスへのnotifyChangeもトリガとなる
です。

また、ContentObserver登録時の引数notifyForDescendentsにtrueを指定すると、
 登録したURIの子や孫にあたるパスへのnotifyChangeもトリガになる
ことがわかりました。

⇒notifyForDescendentsについて:android developers

下記は調査で使用したデータ。

次のURIを監視するContentObserverを登録。
  監視URI = content://yuki.contentobserver/lv0
  監視URI = content://yuki.contentobserver/lv0/lv1
  監視URI = content://yuki.contentobserver/lv0/lv1/lv2
  監視URI = content://yuki.contentobserver/lv1/lv0
  監視URI = content://yuki.contentobserver/lv2/lv1/lv0

いくつかのURIにnotifyChangeして、上記ContentObserverにonChange通知されるかを検証
(結果の見方は ○:onChange通知あり/×:onChange通知なし です)

ContentObserver登録時、notifyForDescendentsに"false"を指定した場合
content://yuki.contentobserver/lv0 にnotifyChangeすると...
 ○:監視URI = content://yuki.contentobserver/lv0
 ○:監視URI = content://yuki.contentobserver/lv0/lv1
 ○:監視URI = content://yuki.contentobserver/lv0/lv1/lv2
 ×:監視URI = content://yuki.contentobserver/lv1/lv0
 ×:監視URI = content://yuki.contentobserver/lv2/lv1/lv0

content://yuki.contentobserver/lv0/lv1 にnotifyChangeすると...
 ×:監視URI = content://yuki.contentobserver/lv0
 ○:監視URI = content://yuki.contentobserver/lv0/lv1
 ○:監視URI = content://yuki.contentobserver/lv0/lv1/lv2
 ×:監視URI = content://yuki.contentobserver/lv1/lv0
 ×:監視URI = content://yuki.contentobserver/lv2/lv1/lv0

content://yuki.contentobserver/lv0/lv1/lv2 にnotifyChangeすると...
 ×:監視URI = content://yuki.contentobserver/lv0
 ×:監視URI = content://yuki.contentobserver/lv0/lv1
 ○:監視URI = content://yuki.contentobserver/lv0/lv1/lv2
 ×:監視URI = content://yuki.contentobserver/lv1/lv0
 ×:監視URI = content://yuki.contentobserver/lv2/lv1/lv0


ContentObserver登録時、notifyForDescendentsに"true"を指定した場合
content://yuki.contentobserver/lv0 にnotifyChangeすると...
 ○:監視URI = content://yuki.contentobserver/lv0
 ○:監視URI = content://yuki.contentobserver/lv0/lv1
 ○:監視URI = content://yuki.contentobserver/lv0/lv1/lv2
 ×:監視URI = content://yuki.contentobserver/lv1/lv0
 ×:監視URI = content://yuki.contentobserver/lv2/lv1/lv0

content://yuki.contentobserver/lv0/lv1 にnotifyChangeすると...
 ○:監視URI = content://yuki.contentobserver/lv0
 ○:監視URI = content://yuki.contentobserver/lv0/lv1
 ○:監視URI = content://yuki.contentobserver/lv0/lv1/lv2
 ×:監視URI = content://yuki.contentobserver/lv1/lv0
 ×:監視URI = content://yuki.contentobserver/lv2/lv1/lv0

content://yuki.contentobserver/lv0/lv1/lv2 にnotifyChangeすると...
 ○:監視URI = content://yuki.contentobserver/lv0
 ○:監視URI = content://yuki.contentobserver/lv0/lv1
 ○:監視URI = content://yuki.contentobserver/lv0/lv1/lv2
 ×:監視URI = content://yuki.contentobserver/lv1/lv0
 ×:監視URI = content://yuki.contentobserver/lv2/lv1/lv0

以上です。