Получить триггер от ContentObserver

Есть ли способ узнать, почему был запущен ContentObserver? Например, если я отслеживаю SMS через URI «content://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????????
   }        
}

person Utopia025    schedule 30.09.2013    source источник


Ответы (1)


Смотрите, вы получите Onchange в следующих случаях

  1. Если какой-либо синкадаптер активен в этой базе данных, то он будет инициировать onchange каждый раз, когда он pefrom sync, в этом случае вы можете получить onchange, даже если на самом деле ничего не изменилось.
  2. Если есть фактические изменения в наборе данных.

Теперь, перейдя к выяснению данных, которые были изменены, установка наблюдателя для каждого возможного URI — не совсем хорошая идея, при этом вы можете хотя обнаружить сценарии обновления или удаления, но обнаружение новой вставки будет проблемой. Я предлагаю вам следовать

Держите одного наблюдателя, при инициализации вы можете обрабатывать все данные, которые доступны изначально, продолжайте помнить column_id, update_timestamp и общее количество строк, когда вы продвигаетесь вперед, когда onchange произойдет в следующий раз с Coulmn_Id, update_timestamp и количество, вы можете выяснить тип изменения, которое произошло

--> Ищите любые строки, имеющие column_id больше, чем вы помните, если они возвращают какие-либо строки, то, безусловно, вставляются некоторые новые строки, вы можете запросить их специально --> если вышеуказанные критерии не выполняются, вам нужно искать update_timespamp что-либо большее, чем Последнее, что вы помните, сообщит, были ли обновлены строки --> Если оба вышеперечисленных критерия недействительны, найдите разницу в количестве, которая может рассказать вам об операции удаления.

если ничего из вышеперечисленного не происходит, ясно, что это ничего не значит, просто игнорируйте сигнал onchange. Надеюсь, поможет.

person Techfist    schedule 01.10.2013