0

有没有办法告诉 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????????
   }        
}
4

1 回答 1

0

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

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

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

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

--> 查找 column_id 大于您记忆的任何行,如果它返回任何行,那么肯定会插入一些新行,您可以专门查询它们 --> 如果上述条件失败,那么您需要查找 update_timespamp 任何大于的内容最后你记得会告诉你是否更新了行 - >如果以上两个cirteria fial然后寻找可能告诉你删除操作的计数差异。

如果以上都没有发生,显然它什么都不是,那么就忽略 onchange 信号。希望能帮助到你。

于 2013-10-01T09:26:30.573 回答