2013-09-30 52 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信号。希望能帮助到你。