ContentProvider 분석

6490 단어 자바androidxml
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"을 발견 할 수 있 습 니 다.
        package="com.android.providers.settings"
        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" />

좋은 웹페이지 즐겨찾기