Android, прослушиватель/наблюдатель/обратный вызов при изменении события календаря

Я пишу приложение, которое должно знать, когда собрание добавляется/удаляется/изменяется в календаре.
Я знаю, как получить все данные из календаря, используя CursorLoader в URI календаря.
Также я знаю, как слушать изменения календаря, используя функцию ContentObserver.

Проблема в том, что ContentObserver.onChange(boolean selfChange, Uri uri) не предоставляет информацию об измененном событии. поэтому единственный способ узнать, в чем заключалось изменение, - это снова загрузить весь календарь (или его часть), используя CursorLoader и сравнив старый с новым.

Есть ли способ "зарегистрироваться на изменения" в календаре и получать измененные события?


person Eli Skoran    schedule 07.06.2015    source источник
comment
перейдите по ссылке ниже, если вы получили ответ stackoverflow.com/questions /15217723/   -  person Damodhar Meshram    schedule 07.06.2015


Ответы (2)


К сожалению, такой возможности нет. Я даже дошел до того, что отразил весь комплект, который шел с этим намерением, - ничего. ИМХО, некоторых поверхностей API Android совершенно не хватает, я думаю, это только один из таких случаев.

person Eyal Perry    schedule 12.06.2015

Каждое событие после события ручного редактирования устанавливает CalendarContract.DIRTY = 1 (используется для указания наличия локальных, несинхронизированных изменений). Найдите эти события. Не забудьте сбросить этот флаг (равно 0) после синхронизации.

person ilyamuromets    schedule 30.09.2016
comment
но могу ли я быть уверен, что этот флаг останется равным 1 к тому времени, когда я обработаю это событие? а также мне нужно обработать ситуацию, в которой я читаю один и тот же объект в два разных раза (флаг оставался 1 для некоторых событий) - person Eli Skoran; 02.10.2016
comment
Каждое событие имеет свой собственный флаг CalendarContract.DIRTY (значение по умолчанию — 0). Когда пользователь редактирует событие, флаг CalendarContract.DIRTY принимает значение 1, и только вы можете сбросить этот флаг на 0 после обработки события. Пользуюсь этим механизмом давно и все работает отлично. - person ilyamuromets; 03.10.2016
comment
это также работает, когда календарь изменяется в облаке и синхронизируется с устройством. - person Eli Skoran; 16.10.2016
comment
например, если вы меняете событие со своего компьютера (внешнего просмотра) и оно синхронизируется с устройством. будет ли он также иметь DIRTY = 1? - person Eli Skoran; 16.10.2016
comment
Нет. Флаг DIRTY принимает значение 1, только если вы вручную меняете/создаете событие в устройстве и не сбрасывается сам по себе. - person ilyamuromets; 17.10.2016