ContentProvider 분석
이틀 동안 내 가 알 기 로 는 네가 사용 할 때 만 ContentProvider 의 onCreate 함 수 를 호출 하여 만 드 는 것 이다.언제 쓸 때 라 고 부 를 거 예요?예 를 들 어 데이터 베 이 스 를 조회 하거나 삭제 하려 고 할 때 ContentResolver 의 quire 나 delete 를 통 해 데 이 터 를 조작 할 때 ContentProvider 의 onCreate 함 수 를 호출 합 니 다.데이터 베 이 스 를 만 들 었 다 면 다시 만 들 지 않 습 니 다.ContentResolver 의 소스 코드 를 통 해 이해 할 수 있 습 니 다.
public final Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
IContentProvider provider = acquireProvider(uri);
if (provider == null) {
return null;
}
try {
Cursor qCursor = provider.query(uri, projection, selection, selectionArgs, sortOrder);
if(qCursor == null) {
releaseProvider(provider);
return null;
}
//Wrap the cursor object into CursorWrapperInner object
return new CursorWrapperInner(qCursor, provider);
} catch (RemoteException e) {
releaseProvider(provider);
return null;
} catch(RuntimeException e) {
releaseProvider(provider);
throw e;
}
}
ContentResolver 의 acquireProvider(uri)를 통 해 해당 하 는 Provider 를 얻 을 수 있 습 니 다.uri 의 Authority 필드 를 통 해 어떤 provider 를 사용 해 야 하 는 지 알 수 있 습 니 다.즉,왜 Provider 의 menifester.xml 에서
다음은 안 드 로 이 드 의 기 존 Provider 에 대한 설명 입 니 다.
1,SettingsProvider
<!-- Permission to write Gservices in SettingsProvider -->
<permission android:name="android.permission.WRITE_GSERVICES"
android:label="@string/permlab_writeGservices"
android:description="@string/permdesc_writeGservices"
android:protectionLevel="signature" />
<application android:allowClearUserData="false"
android:label="Settings Storage"
android:icon="@drawable/ic_launcher_settings">
<provider android:name="SettingsProvider" android:authorities="settings"
android:process="system" android:multiprocess="false"
android:writePermission="android.permission.WRITE_SETTINGS"
android:initOrder="100" />
</application>
</manifest>
SettingsProvider 를 자세히 보면 manifester.xml 에서 android:process="system"과 android:shared UserId="android.uid.system"을 발견 할 수 있 습 니 다.
android:shared UserId="android.uid.system">이 두 문장 이 더 많아 서 시스템 이 불 러 오 면 불 러 올 것 같 습 니 다.켜 진 logcat 에 주의 하면 발견 할 수 있 습 니 다.
04-29 02:32:0.612:INFO/activity Thread(79):Publishing provider settings:com.android.providers.settings.Settings provider 가 Activity Thread 를 통 해 위로 쫓 아가 기 시작 하면 알 수 있 습 니 다.
SystemServer.java 에서
Activity Manager Service.java 에 있 는
Log.i(TAG, "Starting System Content Providers.");
ActivityManagerService.installSystemProviders();
Activity Thread.java 로 이동:
public static final void installSystemProviders() {
[color=blue]ProcessRecord app = mSelf.mProcessNames.get("system", Process.SYSTEM_UID);[/color]
List providers = mSelf.generateApplicationProvidersLocked(app);
mSystemThread.installSystemProviders(providers);
}
public final void installSystemProviders(List providers) {
if (providers != null) {
installContentProviders(mInitialApplication,
(List<ProviderInfo>)providers);
}
}
2,CalendarProvider
Manifester.xml
private final void installContentProviders(
Context context, List<ProviderInfo> providers) {
final ArrayList<IActivityManager.ContentProviderHolder> results =
new ArrayList<IActivityManager.ContentProviderHolder>();
Iterator<ProviderInfo> i = providers.iterator();
while (i.hasNext()) {
ProviderInfo cpi = i.next();
StringBuilder buf = new StringBuilder(128);
buf.append("Publishing provider ");
buf.append(cpi.authority);
buf.append(": ");
buf.append(cpi.name);
Log.i(TAG, buf.toString());
IContentProvider cp = installProvider(context, null, cpi, false);
if (cp != null) {
IActivityManager.ContentProviderHolder cph =
new IActivityManager.ContentProviderHolder(cpi);
cph.provider = cp;
results.add(cph);
// Don't ever unload this provider from the process.
synchronized(mProviderMap) {
mProviderRefCountMap.put(cp.asBinder(), new ProviderRefCount(10000));
}
}
}
SettingsProvider 방식 이 아니 라 android.intent.action.BOOT 를 통 과 했 습 니 다.COMPLETED 방식:
CalendarReceiver.java
<receiver android:name="CalendarReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver> <provider android:name="CalendarProvider" android:authorities="calendar"
android:syncable="true" android:multiprocess="false"
android:readPermission="android.permission.READ_CALENDAR"
android:writePermission="android.permission.WRITE_CALENDAR" />
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.