6월 3일의 ⁠#Android11: 베타 버전 출시 행사에 참여하세요.

스터브 콘텐츠 제공업체 만들기

동기화 어댑터 프레임워크는 유연하고 매우 안전한 콘텐츠 제공업체 프레임워크에서 관리하는 기기 데이터로 작동하도록 설계되었습니다. 따라서 동기화 어댑터 프레임워크는 이 프레임워크를 사용하는 앱에서 이미 로컬 데이터의 콘텐츠 제공업체를 정의했을 것으로 기대합니다. 동기화 어댑터 프레임워크가 동기화 어댑터를 실행하려는데 앱에 콘텐츠 제공업체가 없으면 동기화 어댑터가 비정상 종료됩니다.

서버에서 기기로 데이터를 전송하는 앱을 새로 개발 중이라면 로컬 데이터를 콘텐츠 제공업체에 저장할 것을 적극 권장합니다. 동기화 어댑터에 중요할 뿐 아니라 다양한 보안 이점이 있는 콘텐츠 제공업체는 Android 시스템의 데이터 저장용량을 처리하도록 특별히 설계되었습니다. 콘텐츠 제공업체 만들기에 관해 자세히 알아보려면 콘텐츠 제공업체 만들기를 참조하세요.

그러나 로컬 데이터를 이미 다른 형식으로 저장한 경우에도 동기화 어댑터를 사용하여 데이터 전송을 처리할 수 있습니다. 콘텐츠 제공업체 관련 동기화 어댑터 프레임워크 요구사항을 충족하려면 스터브 콘텐츠 제공업체를 앱에 추가하세요. 스터브 제공업체에서는 콘텐츠 제공업체 클래스를 구현하지만 필요한 모든 메서드에서 null 또는 0을 반환합니다. 스터브 제공업체를 추가하면 개발자는 동기화 어댑터를 사용하여 자신이 선택한 저장 메커니즘에서 데이터를 전송할 수 있습니다.

앱에 이미 콘텐츠 제공업체가 있다면 스터브 콘텐츠 제공업체가 필요 없습니다. 이때는 현재 강의를 건너뛰고 동기화 어댑터 만들기 강의로 이동하세요. 아직 콘텐츠 제공업체가 없다면 이 강의에서 동기화 어댑터를 프레임워크에 플러그인할 수 있는 스터브 콘텐츠 제공업체를 추가하는 방법을 안내합니다.

스터브 콘텐츠 제공업체 추가

앱에 스터브 콘텐츠 제공업체를 만들려면 ContentProvider 클래스를 확장하고 필요한 메서드를 스터브하세요. 다음 스니펫에서는 스터브 제공업체를 만드는 방법을 보여줍니다.

Kotlin

    /*
     * Define an implementation of ContentProvider that stubs out
     * all methods
     */
    class StubProvider : ContentProvider() {
        /*
         * Always return true, indicating that the
         * provider loaded correctly.
         */
        override fun onCreate(): Boolean  = true

        /*
         * Return no type for MIME type
         */
        override fun getType(uri: Uri): String?  = null

        /*
         * query() always returns no results
         *
         */
        override fun query(
                uri: Uri,
                projection: Array<String>,
                selection: String,
                selectionArgs: Array<String>,
                sortOrder: String
        ): Cursor?  = null

        /*
         * insert() always returns null (no URI)
         */
        override fun insert(uri: Uri, values: ContentValues): Uri? = null

        /*
         * delete() always returns "no rows affected" (0)
         */
        override fun delete(uri: Uri, selection: String, selectionArgs: Array<String>): Int = 0

        /*
         * update() always returns "no rows affected" (0)
         */
        override fun update(
                uri: Uri,
                values: ContentValues,
                selection: String,
                selectionArgs: Array<String>
        ): Int = 0
    }
    

자바

    /*
     * Define an implementation of ContentProvider that stubs out
     * all methods
     */
    public class StubProvider extends ContentProvider {
        /*
         * Always return true, indicating that the
         * provider loaded correctly.
         */
        @Override
        public boolean onCreate() {
            return true;
        }
        /*
         * Return no type for MIME type
         */
        @Override
        public String getType(Uri uri) {
            return null;
        }
        /*
         * query() always returns no results
         *
         */
        @Override
        public Cursor query(
                Uri uri,
                String[] projection,
                String selection,
                String[] selectionArgs,
                String sortOrder) {
            return null;
        }
        /*
         * insert() always returns null (no URI)
         */
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            return null;
        }
        /*
         * delete() always returns "no rows affected" (0)
         */
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
            return 0;
        }
        /*
         * update() always returns "no rows affected" (0)
         */
        public int update(
                Uri uri,
                ContentValues values,
                String selection,
                String[] selectionArgs) {
            return 0;
        }
    }
    

manifest에서 제공업체 선언하기

동기화 어댑터 프레임워크는 앱이 앱 manifest에서 제공업체를 선언했는지 검사하여 앱에 콘텐츠 제공업체가 있는지 확인합니다. manifest에서 스터브 제공업체를 선언하려면 다음 속성을 지닌 <provider> 요소를 추가하세요.

android:name="com.example.android.datasync.provider.StubProvider"
스터브 콘텐츠 제공업체를 구현하는 클래스의 정규화된 이름을 지정합니다.
android:authorities="com.example.android.datasync.provider"
스터브 콘텐츠 제공업체를 식별하는 URI 권한입니다. 이 값에 '.provider'라는 문자열을 추가하여 앱의 패키지 이름으로 지정하세요. 스터브 제공업체를 시스템에 선언하더라도 제공업체 자체에 액세스를 시도하는 것은 없습니다.
android:exported="false"
다른 앱이 콘텐츠 제공업체에 액세스할 수 있는지 여부를 결정합니다. 스터브 콘텐츠 제공업체의 경우 다른 앱이 제공업체를 볼 수 있게 허용할 필요가 없으므로 값을 false로 설정하세요. 이 값은 동기화 어댑터 프레임워크와 콘텐츠 제공업체 간 상호작용에 영향을 미치지 않습니다.
android:syncable="true"
제공업체를 동기화할 수 있음을 나타내는 플래그를 설정합니다. 이 플래그를 true로 설정하면 코드에서 setIsSyncable()을 호출하지 않아도 됩니다. 이 플래그를 통해 동기화 어댑터 프레임워크가 콘텐츠 제공업체와 데이터를 전송하도록 허용할 수 있지만 명시적으로 전송할 때만 전송이 이루어집니다.

다음 스니펫에서는 앱 manifest에 <provider> 요소를 추가하는 방법을 보여줍니다.

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.network.sync.BasicSyncAdapter"
        android:versionCode="1"
        android:versionName="1.0" >
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
        ...
        <provider
            android:name="com.example.android.datasync.provider.StubProvider"
            android:authorities="com.example.android.datasync.provider"
            android:exported="false"
            android:syncable="true"/>
        ...
        </application>
    </manifest>
    

동기화 어댑터 프레임워크에 필요한 종속성을 만들었으므로 이제 데이터 전송 코드를 캡슐화하는 구성요소를 만들 수 있습니다. 이 구성요소를 동기화 어댑터라고 합니다. 다음 강의에서는 이 구성요소를 앱에 추가하는 방법을 안내합니다.