【问题标题】:Get trigger from ContentObserver从 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????????
   }        
}

【问题讨论】:

    标签: android sms contentobserver


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多