首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ContentObserver获取触发器

从ContentObserver获取触发器
EN

Stack Overflow用户
提问于 2013-10-01 03:04:10
回答 1查看 522关注 0票数 0

有没有办法判断ContentObserver被触发的原因?例如,如果我通过"content:// SMS“URI监视SMS,并且发送或接收了SMS,那么是否可以在ContentObserver类中推断SMS类型(我知道我可以设置N ContentObservers,指定不同的URI,但我希望有一种方法可以从ContentObserver类中辨别出来)?

奖励:还有一个有趣的微妙之处:

第二种方法仅在API级别16以上可用,因此代码不应依赖于URI才能正常工作。

ContentObserver:

代码语言:javascript
复制
ContentResolver contentResolver = getBaseContext().getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms"), true, 
                   new MessageObserver(new Handler(), getBaseContext()));

ContentObserver类:

代码语言:javascript
复制
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????????
   }        
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-01 17:26:31

在以下提到的情况下,您将收到Onchange

  1. 如果数据库上的任何同步适配器处于活动状态,则它将在每次同步时触发onchange,在这种情况下,即使实际上没有任何更改,也可能会收到onchange。
  2. 如果数据集中有实际更改,则为

现在来弄清楚哪些数据被更改了,为每个可能的URI设置一个观察者根本不是一个好主意,这样虽然你可以检测更新或删除场景,但感知新的插入将是一个问题。我会建议你跟随

保持一个观察者,在初始化时,你可以处理最初可用的整个数据,一旦你前进,保持记住column_id,update_timestamp和总行数,当下一次发生变化时,使用Coulmn_Id,update_timestamp和count你可以弄清楚发生的变化类型

-->查找任何column_id大于您记忆的行,如果它返回任何行,那么肯定会插入一些新行,您可以专门查询它们-->如果以上条件失败,则您需要查找update_timespamp任何大于您所记得的值的值将判断是否已更新的行-->如果以上两个循环都存在,则查找计数的差异,这可能会告诉您有关删除操作的信息。

如果以上都没有发生,那么很明显这不是什么,那么就忽略onchange信号。希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19101814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档