Я изучил, как использовать ContentProviders и Loaders этот учебник
Как я вижу это:
Мы имеем Activity с ListView, SimpleCursorAdapter и CursorLoader. Мы также реализуем ContentProvider.
В Activity мы можем вызвать getContentResolver().insert(URI, contentValues); нажатием кнопки.
В нашей реализации ContentProvider в конце метода insert() мы вызываем getContentResolver().notifyChange(URI, null);, а наш CursorLoader получит сообщение о том, что он должен перезагрузить данные и обновить интерфейс. Также, если мы используем FLAG_REGISTER_CONTENT_OBSERVER в SimpleCursorAdapter, он также получит сообщение, и его метод onContentChanged() будет вызван.
Поэтому наш ListView будет обновляться, если мы вставляем, обновляем или удаляем данные.
Activity.startManagingCursor(cursor); устарел, cursor.requery() устарел, поэтому я не вижу смысла в работе с cursor.setNotificationUri().
Я просмотрел исходный код метода setNotificationUri() и увидел, что он вызывает mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver) внутри метода. Также CursorLoader делает то же самое. Наконец, курсор получит сообщение, и внутри курсора будет вызываться следующий метод:
protected void onChange(boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange, null);
// ...
}
}
Но я не могу понять это.
Итак, мой вопрос: почему мы должны называть cursor.setNotificationUri() в query() методе нашей реализации ContentProvider?