从 ContentObserver 获取触发器

Posted

技术标签:

【中文标题】从 ContentObserver 获取触发器【英文标题】:Get trigger from ContentObserver 【发布时间】:2013-10-06 18:20:59 【问题描述】:

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

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

第二种方法只能从 API 级别 16 开始使用,因此代码不应依赖 URI 才能正常工作。

内容观察者:

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????????
           

【问题讨论】:

【参考方案1】:

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

    如果任何同步适配器在该数据库上处于活动状态,那么它将在每次从同步开始时触发 onchange,在这种情况下,即使实际上没有任何更改,您也可能会收到 onchange。 如果数据集有实际变化。

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

保持一个观察者,在初始化时,您可以处理最初可用的整个数据,继续记住 column_id,update_timestamp 和总行数,一旦您前进,当 onchange 下次使用 Coulmn_Id,update_timestamp 和计数时,您可以找出种类发生的变化

--> 寻找任何 column_id 大于你记忆的行,如果它返回任何行,那么肯定会插入一些新行,你可以专门查询它们 --> 如果上述条件失败,那么您需要查找 update_timespamp 任何大于最后一次的东西,您会告诉您是否更新了行 --> 如果上述两个条件都满足,则查找计数差异,这可能会告诉您有关删除操作的信息。

如果以上都没有发生,那么显然它什么都没有,然后忽略 onchange 信号。希望对您有所帮助。

【讨论】:

以上是关于从 ContentObserver 获取触发器的主要内容,如果未能解决你的问题,请参考以下文章

短信 ContentObserver onChange() 触发多次

安卓ContentObserver模式获取短信用正则自己主动填充验证码

Android onChange 事件未在 contentObserver 中触发,用于 android 5 (Lollipop) 上的 chrome 历史记录

内容观察者

通过 contentObserver 阻止传出短信

手动更新联系人的 ContentObserver