Я копался в структуре на ICS, и кажется, что ContactsProvider2 в поставщике контактов Android вызывает notifyChange после любой вставки/обновления, и не только это, он делает это:
NotifyChange(ContactsContract.AUTHORITY_URI, null, syncToNetwork);
Это означает, что ЛЮБАЯ вставка/обновление/удаление в контактах AUTHORITY Uri запускает наблюдателей контента для получения обновления. Хотя в теории это довольно хорошо. Похоже, что это также запускается обновлениями присутствия.
Если я попытаюсь переместить курсор в таблицу данных, он также привяжет таблицу данных к присутствию, и любые обновления присутствия будут вызваны onLoadFinished (CursorLoader).
Изучая проблему с курсором, похоже, что это связано с тем, что ContactsProvider2 вызывает
setTablesAndProjectionMapForData()
который, в свою очередь, добавляет столбцы Presnce/status к каждой строке данных.
appendContactPresenceJoin(sb, projection, RawContacts.CONTACT_ID);
appendContactStatusUpdateJoin(sb, projection, ContactsColumns.LAST_STATUS_UPDATE_ID);
appendDataPresenceJoin(sb, projection, DataColumns.CONCRETE_ID);
appendDataStatusUpdateJoin(sb, projection, DataColumns.CONCRETE_ID);
Есть ли способ зарегистрировать Content Observer для получения обновлений в таблице данных без фактического получения обновлений для изменений Presence? Я считаю, что присутствие было исключено из запросов Data.CONTENT_URI в 2.3/3.x.. Но похоже, что это изменилось..