ContentObserver 원리
public final void registerContentObserver(Uri uri, boolean notifyForDescendents,
ContentObserver observer, int userHandle) {
try {
getContentService().registerContentObserver(uri, notifyForDescendents,
observer.getContentObserver(), userHandle);
} catch (RemoteException e) {
}
}
보시다시피 getContent Service () 를 통해 Content Service의 시스템 서비스를 얻은 다음에 observer의binder 대상을 가져와 Content Service에 등록합니다.그리고 getContentSerivce의 구현은 다음과 같습니다.
/** @hide */
public static IContentService getContentService() {
if (sContentService != null) {
return sContentService;
}
IBinder b = ServiceManager.getService(CONTENT_SERVICE_NAME);
if (false) Log.v("ContentService", "default service binder = " + b);
sContentService = IContentService.Stub.asInterface(b);
if (false) Log.v("ContentService", "default service = " + sContentService);
return sContentService;
}
ContentService가 Service Manager에 등록된 시스템 서비스인지 확인할 수 있습니다.Content Resolver 등록 Content Prvider는 Binder의 리셋 대상을 System Server의 Content Service에 등록했기 때문에 감청할 필요가 없는 내용이 실행되어야 합니다.그렇다면 통지는 어떻게 이루어졌을까?ContentReslover의 notifyChange(Uri uri)를 통해
public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork,
int userHandle) {
try {
getContentService().notifyChange(
uri, observer == null ? null : observer.getContentObserver(),
observer != null && observer.deliverSelfNotifications(), syncToNetwork,
userHandle);
} catch (RemoteException e) {
}
}
즉, 등록과 알림은 모두 Content Service를 통해 해결된다. 알림자는 몇 명이 등록하지 않아도 된다. Content Service에 내용 변경 알림을 보내면 된다. uri를 통해 Content Service의 일부 내용이 변경되었다고 알려주면 된다. Content Service는 이uri Content Observer를 등록하는 모든 프로세스에 알림을 보낸다.
이제 커서가 어떻게 등록했는지 볼까요?일반적으로 Cursor는 ContentProvider 질의를 통해 반환되므로 두 가지 조건이 있습니다.
AbstractCursor.java
public void setNotificationUri(ContentResolver cr, Uri notifyUri, int userHandle) {
synchronized (mSelfObserverLock) {
mNotifyUri = notifyUri;
mContentResolver = cr;
if (mSelfObserver != null) {
mContentResolver.unregisterContentObserver(mSelfObserver);
}
mSelfObserver = new SelfContentObserver(this);
mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver, userHandle);
mSelfObserverRegistered = true;
}
}
그래서 커서의 등록도 사실은Content Resolver를 통해 이루어졌습니다.
요약: Content Resolver든Cursor를 통해Content Observer를 등록하든 그 등록과 알림은 시스템서버의Content Service를 통해 이루어지며 감청할 내용이 이 프로세스에 있더라도 binder를 통해 알림을 호출합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.