Метод onChange для наблюдателя контента срабатывает несколько раз

Я знаю, что у вас есть соблазн отметить это дубликат, но подождите, давайте рассмотрим это снова с моими подробными (но неудачными) попытками.

Стратегия 1: Алгоритм: Ответ

  1. При первом запуске onChange обновите идентификатор строки

  2. В следующий раз, когда onChange будет запущен, получите обновленный идентификатор строки

  3. Сопоставьте идентификатор

  4. Игнорировать, если тот же идентификатор

Проблема с этим подходом заключается в том, что он уязвим для условий гонки . Если к тому моменту, когда вы получите идентификатор обновленной строки, onChange уволился во второй раз , этот алгоритм терпит неудачу. Это происходило из моего личного опыта во время тестирования на медленных машинах или машинах, работающих на максимальной мощности.

Стратегия 2: Алгоритм: Ответ

Переопределить доставкуSelfNotifications () для возврата true.

Сначала это кажется многообещающим, но не работает. Код, который я использовал для ссылки:

В основной деятельности: метод OnCreate Я зарегистрирую:

getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new CtObserver(new Handler())); 

Затем в отдельном классе:

 package com.example.testproject; import android.database.ContentObserver; import android.os.Handler; import android.util.Log; /** * @author Time Traveller */ public class CtObserver extends ContentObserver { public CtObserver(Handler handler) { super(handler); } public boolean deliverSelfNotifications(){ return true; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Log.e("onChange","Fired"); } } 

Почему вы должны внести свой вклад в этот ответ:
Запрос провайдера SMS-сообщений является единственным способом для приложений не по умолчанию для захвата события для отправленного SMS . Но до сих пор я не нашел убедительного полностью функционального ответа для этого метода. Так что нам действительно нужно умудрить это!

Вопросов:

  1. Каков функциональный (не измененный) способ просто знать, что SMS-сообщение было написано только для поставщика контента?
  2. Каков правильный способ использования deliverSelfNotifications () в классе Content Observer?

Вам не нужно отвечать на все вопросы, просто скажите нам все, что вы знаете.

Solutions Collecting From Web of "Метод onChange для наблюдателя контента срабатывает несколько раз"

deliverSelfNotifications() наиболее вероятно предназначен для разделения изменений данных из изменений презентации. Например, контент может быть отсортирован в вашем приложении, но нет необходимости, чтобы внешние приложения снова собирали данные только потому, что они были отсортированы, так как большинство времени это будет неактуальным (это приложение, вероятно, использует другое представление в любом случае). Другими словами – этот метод управляет, если вы хотите получать изменения, внесенные в контент самим поставщиком, которые могут или не могут фактически отражать изменения данных в значимых для вас способах использования.

Чтобы использовать его, вам понадобится реализация ContentObservable которая использует уведомления об изменениях.

Еще один вопрос, который я хотел бы предложить HashSet для хранения идентификаторов сообщений. С его помощью вы можете сравнивать идентификатор сообщения со всеми обработанными сообщениями , а не только с последним, тем самым устраняя проблему, о которой вы говорили.