Receives call backs for changes to content. Must be implemented by objects which are added to a ContentObservable.Latin IME의 소스에서 사용되는 부분을 발췌하면 다음과 같다.
com.android.inputmethod.latin.UserBinaryDictionary의 생성자에서 아래 코드를 발견할 수 있다.
ContentResolver cres = context.getContentResolver();
mObserver = new ContentObserver(null) {
@Override
public void onChange(final boolean self) {
// This hook is deprecated as of API level 16, but should still be supported for
// cases where the IME is running on an older version of the platform.
onChange(self, null);
}
// The following hook is only available as of API level 16, and as such it will only
// work on JellyBean+ devices. On older versions of the platform, the hook
// above will be called instead.
@Override
public void onChange(final boolean self, final Uri uri) {
setRequiresReload(true);
// We want to report back to Latin IME in case the user just entered the word.
// If the user changed the word in the dialog box, then we want to replace
// what was entered in the text field.
if (null == uri || !(context instanceof LatinIME)) return;
final long changedRowId = ContentUris.parseId(uri);
if (-1 == changedRowId) return; // Unknown content... Not sure why we're here
final String changedWord = getChangedWordForUri(uri);
((LatinIME)context).onWordAddedToUserDictionary(changedWord);
}
};
cres.registerContentObserver(Words.CONTENT_URI, true, mObserver);
이코드만 보면, getContentResolver에서 ContentResolver를 가져와서 Observer를 등록하면 된다.종료 때는 위 소스에는 빠져있지만 unregisterContentObserver를 사용해서 해제하면 된다.
전혀 복잡할 내용도 없고 간결한데 뭔가 답답한 이유는,
context, Uri 에 대한 개념이 부족해서이리라.
context와 Uri를 좀 더 확인 후 여기에도 정리해 두겠다.
== 추가 내용 ==
Uri는 특별한게 없고, 예상하던 Uniform Resource Identifiers가 맞다.
어렵게 생각할 필요 없었다.
Words.CONTENT_URI는 android.jar에 포함되어 있었다. 이 값이 궁금해 진행이 늦었다.
latin IME소스에 있는 줄 알고 계속 Find usages 호출해서 헤메고 있었는데. Navigation bar를 잘 봤어야지..
어쟀든 값은
public static final Uri CONTENT_URI = Uri.parse("content://user_dictionary/words");
댓글 없음:
댓글 쓰기