Senkronizasyon bağdaştırıcısı oluşturma

Not: Arka planda işleme özelliklerinin çoğu için önerilen çözüm olarak WorkManager'ı öneriyoruz. Size en uygun çözümü öğrenmek için lütfen arka planda işleme kılavuzuna göz atın.

Uygulamanızdaki senkronizasyon adaptörü bileşeni, cihaz ile sunucu arasında veri aktaran görevlerin kodunu içerir. Senkronizasyon bağdaştırıcısı çerçevesi, uygulamanızda sağladığınız planlamaya ve tetikleyicilere bağlı olarak kodu senkronizasyon bağdaştırıcısı bileşeninde çalıştırır. Uygulamanıza bir senkronizasyon adaptörü bileşeni eklemek için aşağıdaki parçaları eklemeniz gerekir:

Senkronizasyon bağdaştırıcısı sınıfı.
Veri aktarımı kodunuzu senkronizasyon bağdaştırıcısı çerçevesiyle uyumlu bir arayüzde sarmalayan sınıf.
Service ile bağlı.
Senkronizasyon bağdaştırıcısı çerçevesinin, senkronizasyon bağdaştırıcısı sınıfınızdaki kodu çalıştırmasına olanak tanıyan bileşen.
Senkronizasyon bağdaştırıcı XML meta veri dosyası.
Senkronizasyon bağdaştırıcınızla ilgili bilgileri içeren bir dosya. Çerçeve, veri aktarımlarınızın nasıl yükleneceğini ve planlanacağını öğrenmek için bu dosyayı okur.
Uygulama manifest dosyasındaki beyanlar.
Bağlı hizmeti tanımlayan ve bağdaştırıcıya özel meta verileri senkronize etmeye işaret eden XML.

Bu derste, bu öğeleri nasıl tanımlayacağınız gösterilmektedir.

Senkronizasyon bağdaştırıcısı sınıfı oluşturma

Dersin bu bölümünde, veri aktarımı kodunu içeren senkronizasyon bağdaştırıcısı sınıfını nasıl oluşturacağınızı öğreneceksiniz. Sınıfı oluşturmak, senkronizasyon bağdaştırıcısı temel sınıfının genişletilmesini, sınıf için kurucuların tanımlanmasını ve veri aktarımı görevlerini tanımladığınız yöntemin uygulanmasını içerir.

Temel senkronizasyon bağdaştırıcısı sınıfını genişlet

Senkronizasyon bağdaştırıcısı bileşenini oluşturmak için AbstractThreadedSyncAdapter öğesini genişletip kurucularını yazarak başlayın. Senkronizasyon bağdaştırıcısı bileşeniniz her oluşturulduğunda, bir etkinlik ayarlamak için Activity.onCreate() uygulamasını kullandığınız gibi, kurulum görevlerini çalıştırmak için kurucuları kullanın. Örneğin, uygulamanız veri depolamak için bir içerik sağlayıcı kullanıyorsa ContentResolver örneği almak için kurucuları kullanın. Android platform 3.0 sürümünde parallelSyncs bağımsız değişkenini desteklemek için oluşturucunun ikinci bir biçimi eklendiğinden, uyumluluğu korumak için oluşturucunun iki biçimi oluşturmanız gerekir.

Not: Senkronizasyon bağdaştırıcısı çerçevesi, tekil örnekler olan senkronizasyon bağdaştırıcısı bileşenleri ile çalışacak şekilde tasarlanmıştır. Senkronizasyon bağdaştırıcısı bileşeninin örneklenmesi, Senkronizasyon Bağdaştırıcısını Çerçeveye Bağlama bölümünde daha ayrıntılı olarak değinilmiştir.

Aşağıdaki örnekte AbstractThreadedSyncAdapter ve kurucularını nasıl uygulayacağınız gösterilmektedir:

Kotlin

/**
 * Handle the transfer of data between a server and an
 * app, using the Android sync adapter framework.
 */
class SyncAdapter @JvmOverloads constructor(
        context: Context,
        autoInitialize: Boolean,
        /**
         * Using a default argument along with @JvmOverloads
         * generates constructor for both method signatures to maintain compatibility
         * with Android 3.0 and later platform versions
         */
        allowParallelSyncs: Boolean = false,
        /*
         * If your app uses a content resolver, get an instance of it
         * from the incoming Context
         */
        val mContentResolver: ContentResolver = context.contentResolver
) : AbstractThreadedSyncAdapter(context, autoInitialize, allowParallelSyncs) {
    ...
}

Java

/**
 * Handle the transfer of data between a server and an
 * app, using the Android sync adapter framework.
 */
public class SyncAdapter extends AbstractThreadedSyncAdapter {
    ...
    // Global variables
    // Define a variable to contain a content resolver instance
    ContentResolver contentResolver;
    /**
     * Set up the sync adapter
     */
    public SyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);
        /*
         * If your app uses a content resolver, get an instance of it
         * from the incoming Context
         */
        contentResolver = context.getContentResolver();
    }
    ...
    /**
     * Set up the sync adapter. This form of the
     * constructor maintains compatibility with Android 3.0
     * and later platform versions
     */
    public SyncAdapter(
            Context context,
            boolean autoInitialize,
            boolean allowParallelSyncs) {
        super(context, autoInitialize, allowParallelSyncs);
        /*
         * If your app uses a content resolver, get an instance of it
         * from the incoming Context
         */
        contentResolver = context.getContentResolver();
        ...
    }

Veri aktarım kodunu ekleme

Senkronizasyon adaptörü bileşeni, veri aktarımını otomatik olarak gerçekleştirmez. Bunun yerine veri aktarım kodunuzu kapsüller. Böylece senkronizasyon bağdaştırıcısı çerçevesi, veri aktarımını uygulamanızın müdahalesine gerek kalmadan arka planda çalıştırabilir. Çerçeve, uygulamanızın verilerini senkronize etmeye hazır olduğunda onPerformSync() yöntemini uygulamanızı çağırır.

Ana uygulama kodunuzdan senkronizasyon bağdaştırıcısı bileşenine veri aktarımını kolaylaştırmak için senkronizasyon bağdaştırıcısı çerçevesi aşağıdaki bağımsız değişkenlerle onPerformSync() yöntemini çağırır:

Hesap
Senkronizasyon bağdaştırıcısını tetikleyen etkinlikle ilişkili bir Account nesnesi. Sunucunuz hesapları kullanmıyorsa bu nesnedeki bilgileri kullanmanız gerekmez.
Ekstralar
Senkronizasyon bağdaştırıcısını tetikleyen etkinlik tarafından gönderilen işaretleri içeren bir Bundle.
Yetki
İçerik sağlayıcının sistemdeki yetkisi. Uygulamanızın bu sağlayıcıya erişimi olmalıdır. Bu yetkili kurum genellikle kendi uygulamanızdaki içerik sağlayıcıya karşılık gelir.
İçerik sağlayıcı istemcisi
Yetkili bağımsız değişkeniyle işaret edilen içerik sağlayıcı için bir ContentProviderClient. ContentProviderClient, içerik sağlayıcıya yönelik basit bir herkese açık arayüzdür. ContentResolver ile aynı temel işlevlere sahiptir. Uygulamanıza ait verileri depolamak için bir içerik sağlayıcı kullanıyorsanız sağlayıcıya bu nesneyle bağlanabilirsiniz. Aksi takdirde, bu bildirimi görmezden gelebilirsiniz.
Senkronizasyon sonucu
Senkronizasyon bağdaştırıcısı çerçevesine bilgi göndermek için kullandığınız bir SyncResult nesnesi.

Aşağıdaki snippet'te onPerformSync() öğesinin genel yapısı gösterilmektedir:

Kotlin

/*
 * Specify the code you want to run in the sync adapter. The entire
 * sync adapter runs in a background thread, so you don't have to set
 * up your own background processing.
 */
override fun onPerformSync(
        account: Account,
        extras: Bundle,
        authority: String,
        provider: ContentProviderClient,
        syncResult: SyncResult
) {
    /*
     * Put the data transfer code here.
     */
}

Java

/*
 * Specify the code you want to run in the sync adapter. The entire
 * sync adapter runs in a background thread, so you don't have to set
 * up your own background processing.
 */
@Override
public void onPerformSync(
        Account account,
        Bundle extras,
        String authority,
        ContentProviderClient provider,
        SyncResult syncResult) {
    /*
     * Put the data transfer code here.
     */
}

onPerformSync() öğesinin gerçek uygulaması, uygulamanızın veri senkronizasyonu gereksinimlerine ve sunucu bağlantı protokollerine bağlı olsa da uygulamanızın gerçekleştirmesi gereken birkaç genel görev vardır:

Sunucuya bağlanılıyor
Veri aktarımınız başladığında ağın kullanılabilir olduğunu varsayabilirsiniz, ancak senkronizasyon bağdaştırıcısı çerçevesi bir sunucuya otomatik olarak bağlanmaz.
Veri indirme ve yükleme
Senkronizasyon bağdaştırıcıları, veri aktarımı görevlerini otomatik hale getirmez. Bir sunucudan veri indirip içerik sağlayıcıda saklamak istiyorsanız verileri isteyen, indiren ve sağlayıcıya ekleyen kodu sağlamanız gerekir. Benzer şekilde, bir sunucuya veri göndermek isterseniz bu verileri bir dosyadan, veritabanından veya sağlayıcıdan okuyup gerekli yükleme isteğini göndermeniz gerekir. Ayrıca, veri aktarımınız çalışırken oluşan ağ hatalarını da ele almanız gerekir.
Veri çakışmalarını işleme veya verilerin ne kadar güncel olduğunu belirleme
Senkronizasyon bağdaştırıcısı, sunucudaki veriler ile cihazdaki veriler arasındaki çakışmaları otomatik olarak işlemez. Ayrıca, sunucudaki verilerin cihazdaki verilerden daha yeni olup olmadığını veya bunun tersini de otomatik olarak algılamaz. Bunun yerine, bu durumu ele almak için kendi algoritmalarınızı sağlamanız gerekir.
Temizleyin.
Sunucu bağlantılarını her zaman kapatın ve veri aktarımınızın sonunda geçici dosyalar ile önbellekleri temizleyin.

Not: Senkronizasyon bağdaştırıcısı çerçevesi bir arka plan iş parçacığında onPerformSync() çalıştırır. Böylece kendi arka plan işlemenizi ayarlamanız gerekmez.

Senkronizasyonla ilgili görevlerinize ek olarak, ağla ilgili normal görevlerinizi birleştirmeyi ve bunları onPerformSync() öğesine eklemeyi denemelisiniz. Tüm ağ görevlerinizi bu yönteme yoğunlaştırarak ağ arayüzlerini başlatmak ve durdurmak için gereken pil gücünden tasarruf edersiniz. Ağ erişimini daha verimli hale getirme hakkında daha fazla bilgi edinmek için veri aktarım kodunuza ekleyebileceğiniz çeşitli ağ erişimi görevlerini açıklayan Pili Boşaltmadan Veri Aktarımı eğitim sınıfına bakın.

Senkronizasyon bağdaştırıcısını çerçeveye bağlama

Veri aktarım kodunuz artık bir senkronizasyon bağdaştırıcısı bileşeninde yer almaktadır ancak çerçeveye kodunuza erişmesi için izin vermeniz gerekir. Bunu yapmak için senkronizasyon bağdaştırıcısı bileşeninden çerçeveye özel bir Android bağlayıcı nesne geçiren bağlı bir Service oluşturmanız gerekir. Bu bağlayıcı nesne sayesinde çerçeve, onPerformSync() yöntemini çağırabilir ve verileri buna iletebilir.

Senkronizasyon bağdaştırıcısı bileşeninizi hizmetin onCreate() yönteminde tekil bir örnek olarak somutlaştırın. Bileşeni onCreate() üzerinde örneklendirmek suretiyle, çerçeve veri aktarımınızı ilk kez çalıştırmaya çalıştığında gerçekleşen hizmet başlayana kadar bileşenin oluşturulmasını erteleyebilirsiniz. Senkronizasyon bağdaştırıcısı çerçevesinin, tetikleyicilere veya planlamaya yanıt olarak senkronizasyon bağdaştırıcınızın birden fazla yürütmesini sıraya koyması durumunda bileşeni iş parçacığı güvenli bir şekilde örneklendirmeniz gerekir.

Örneğin, aşağıdaki snippet'te Service bağlantısını uygulayan, senkronizasyon bağdaştırıcısı bileşeninizi örnekleyen ve Android bağlayıcı nesnesini alan bir sınıfın nasıl oluşturulacağı gösterilmektedir:

Kotlin

package com.example.android.syncadapter
/**
 * Define a Service that returns an [android.os.IBinder] for the
 * sync adapter class, allowing the sync adapter framework to call
 * onPerformSync().
 */
class SyncService : Service() {
    /*
     * Instantiate the sync adapter object.
     */
    override fun onCreate() {
        /*
         * Create the sync adapter as a singleton.
         * Set the sync adapter as syncable
         * Disallow parallel syncs
         */
        synchronized(sSyncAdapterLock) {
            sSyncAdapter = sSyncAdapter ?: SyncAdapter(applicationContext, true)
        }
    }

    /**
     * Return an object that allows the system to invoke
     * the sync adapter.
     *
     */
    override fun onBind(intent: Intent): IBinder {
        /*
         * Get the object that allows external processes
         * to call onPerformSync(). The object is created
         * in the base class code when the SyncAdapter
         * constructors call super()
         *
         * We should never be in a position where this is called before
         * onCreate() so the exception should never be thrown
         */
        return sSyncAdapter?.syncAdapterBinder ?: throw IllegalStateException()
    }

    companion object {
        // Storage for an instance of the sync adapter
        private var sSyncAdapter: SyncAdapter? = null
        // Object to use as a thread-safe lock
        private val sSyncAdapterLock = Any()
    }
}

Java

package com.example.android.syncadapter;
/**
 * Define a Service that returns an <code><a href="/reference/android/os/IBinder.html">IBinder</a></code> for the
 * sync adapter class, allowing the sync adapter framework to call
 * onPerformSync().
 */
public class SyncService extends Service {
    // Storage for an instance of the sync adapter
    private static SyncAdapter sSyncAdapter = null;
    // Object to use as a thread-safe lock
    private static final Object sSyncAdapterLock = new Object();
    /*
     * Instantiate the sync adapter object.
     */
    @Override
    public void onCreate() {
        /*
         * Create the sync adapter as a singleton.
         * Set the sync adapter as syncable
         * Disallow parallel syncs
         */
        synchronized (sSyncAdapterLock) {
            if (sSyncAdapter == null) {
                sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
            }
        }
    }
    /**
     * Return an object that allows the system to invoke
     * the sync adapter.
     *
     */
    @Override
    public IBinder onBind(Intent intent) {
        /*
         * Get the object that allows external processes
         * to call onPerformSync(). The object is created
         * in the base class code when the SyncAdapter
         * constructors call super()
         */
        return sSyncAdapter.getSyncAdapterBinder();
    }
}

Not: Senkronizasyon bağdaştırıcısı için bağlı bir hizmetin daha ayrıntılı bir örneğini görmek için örnek uygulamaya bakın.

Çerçevenin gerektirdiği hesabı ekleme

Senkronizasyon bağdaştırıcısı çerçevesi, her senkronizasyon adaptörünün bir hesap türüne sahip olmasını gerektirir. Hesap türü değerini Authenticator Meta Veri Dosyasını Ekleme bölümünde beyan etmiştiniz. Şimdi bu hesap türünü Android sisteminde ayarlamanız gerekiyor. Hesap türünü ayarlamak için addAccountExplicitly() yöntemini çağırarak hesap türünü kullanan bir yer tutucu hesap ekleyin.

Yöntemi çağırmak için en iyi yer, uygulamanızın açılış etkinliğinin onCreate() yöntemidir. Bunu nasıl yapacağınız aşağıdaki kod snippet'inde gösterilmektedir:

Kotlin

...
// Constants
// The authority for the sync adapter's content provider
const val AUTHORITY = "com.example.android.datasync.provider"
// An account type, in the form of a domain name
const val ACCOUNT_TYPE = "example.com"
// The account name
const val ACCOUNT = "placeholderaccount"
...
class MainActivity : FragmentActivity() {

    // Instance fields
    private lateinit var mAccount: Account
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
       ...
        // Create the placeholder account
        mAccount = createSyncAccount()
       ...
    }
    ...
    /**
     * Create a new placeholder account for the sync adapter
     */
    private fun createSyncAccount(): Account {
        val accountManager = getSystemService(Context.ACCOUNT_SERVICE) as AccountManager
        return Account(ACCOUNT, ACCOUNT_TYPE).also { newAccount ->
            /*
             * Add the account and account type, no password or user data
             * If successful, return the Account object, otherwise report an error.
             */
            if (accountManager.addAccountExplicitly(newAccount, null, null)) {
                /*
                 * If you don't set android:syncable="true" in
                 * in your <provider> element in the manifest,
                 * then call context.setIsSyncable(account, AUTHORITY, 1)
                 * here.
                 */
            } else {
                /*
                 * The account exists or some other error occurred. Log this, report it,
                 * or handle it internally.
                 */
            }
        }
    }
    ...
}

Java

public class MainActivity extends FragmentActivity {
    ...
    ...
    // Constants
    // The authority for the sync adapter's content provider
    public static final String AUTHORITY = "com.example.android.datasync.provider";
    // An account type, in the form of a domain name
    public static final String ACCOUNT_TYPE = "example.com";
    // The account name
    public static final String ACCOUNT = "placeholderaccount";
    // Instance fields
    Account mAccount;
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        // Create the placeholder account
        mAccount = CreateSyncAccount(this);
        ...
    }
    ...
    /**
     * Create a new placeholder account for the sync adapter
     *
     * @param context The application context
     */
    public static Account CreateSyncAccount(Context context) {
        // Create the account type and default account
        Account newAccount = new Account(
                ACCOUNT, ACCOUNT_TYPE);
        // Get an instance of the Android account manager
        AccountManager accountManager =
                (AccountManager) context.getSystemService(
                        ACCOUNT_SERVICE);
        /*
         * Add the account and account type, no password or user data
         * If successful, return the Account object, otherwise report an error.
         */
        if (accountManager.addAccountExplicitly(newAccount, null, null)) {
            /*
             * If you don't set android:syncable="true" in
             * in your <provider> element in the manifest,
             * then call context.setIsSyncable(account, AUTHORITY, 1)
             * here.
             */
        } else {
            /*
             * The account exists or some other error occurred. Log this, report it,
             * or handle it internally.
             */
        }
    }
    ...
}

Senkronizasyon bağdaştırıcısı meta veri dosyasını ekleme

Senkronizasyon bağdaştırıcısı bileşeninizi çerçeveye bağlamak için çerçeveye bileşeni açıklayan ve ek işaretler sağlayan meta verileri sağlamanız gerekir. Meta veriler, senkronizasyon bağdaştırıcınız için oluşturduğunuz hesap türünü belirtir, uygulamanızla ilişkilendirilmiş bir içerik sağlayıcı yetkilisi tanımlar, sistem kullanıcı arayüzünün senkronizasyon bağdaştırıcılarıyla ilgili bir bölümünü kontrol eder ve senkronizasyonla ilgili diğer işaretleri bildirir. Bu meta verileri, uygulama projenizdeki /res/xml/ dizininde depolanan özel bir XML dosyasında tanımlayın. Dosyaya istediğiniz adı verebilirsiniz ancak dosya genellikle syncadapter.xml olarak adlandırılır.

Bu XML dosyası, aşağıdaki özelliklere sahip tek bir <sync-adapter> XML öğesi içerir:

android:contentAuthority
İçerik sağlayıcınızın URI yetkilisi. Temel İçerik Sağlayıcı Oluşturma dersinde uygulamanız için bir sap içerik sağlayıcı oluşturduysanız uygulama manifestinize eklediğiniz <provider> öğesinde android:authorities özelliği için belirttiğiniz değeri kullanın. Bu özellik, Manifest'te Sağlayıcıyı Bildirme bölümünde daha ayrıntılı olarak açıklanmıştır.
Senkronizasyon bağdaştırıcınızla bir içerik sağlayıcıdan sunucuya veri aktarıyorsanız bu değer, söz konusu veriler için kullandığınız içerik URI yetkilisiyle aynı olmalıdır. Bu değer aynı zamanda uygulama manifestinizde sağlayıcınızı tanımlayan <provider> öğesinin android:authorities özelliğinde belirttiğiniz yetkililerden biridir.
android:accountType
Senkronizasyon bağdaştırıcısı çerçevesinin gerektirdiği hesap türü. Değer, Authenticator Meta Veri Dosyası Ekleme bölümünde açıklandığı gibi, kimlik doğrulayıcı meta veri dosyasını oluştururken sağladığınız hesap türü değeriyle aynı olmalıdır. Bu, aynı zamanda, Çerçevenin Gereken Hesabı Ekleme bölümündeki kod snippet'inde sabit ACCOUNT_TYPE için belirttiğiniz değerdir.
Ayar özellikleri
android:userVisible
Senkronizasyon bağdaştırıcısının hesap türünün görünürlüğünü ayarlar. Varsayılan olarak, hesap türüyle ilişkili hesap simgesi ve etiketi sistemin Ayarlar uygulamasının Hesaplar bölümünde görünür. Bu nedenle, uygulamanızla kolayca ilişkilendirilebilen bir hesap türü veya alan adınız yoksa senkronizasyon bağdaştırıcınızı görünmez yapmanız gerekir. Hesap türünüzü görünmez yaparsanız kullanıcıların, uygulamanızın etkinliklerinden birinde kullanıcı arayüzüyle senkronizasyon bağdaştırıcınızı kontrol etmesine izin verebilirsiniz.
android:supportsUploading
Buluta veri yüklemenize olanak tanır. Uygulamanız yalnızca veri indiriyorsa bu alanı false olarak ayarlayın.
android:allowParallelSyncs
Senkronizasyon bağdaştırıcısı bileşeninizin birden fazla örneğinin aynı anda çalışmasına olanak tanır. Uygulamanız birden fazla kullanıcı hesabını destekliyorsa ve birden fazla kullanıcının paralel olarak veri aktarmasına izin vermek istiyorsanız bunu kullanın. Asla birden fazla veri aktarımı çalıştırmazsanız bu işaretin hiçbir etkisi olmaz.
android:isAlwaysSyncable
Senkronizasyon bağdaştırıcısı çerçevesine, senkronizasyon bağdaştırıcınızı belirttiğiniz herhangi bir zamanda çalıştırabileceğini belirtir. Senkronizasyon bağdaştırıcınızın ne zaman çalışabileceğini programatik olarak kontrol etmek istiyorsanız bu işareti false olarak ayarlayın ve ardından senkronizasyon bağdaştırıcısını çalıştırmak için requestSync() yöntemini çağırın. Senkronizasyon bağdaştırıcısı çalıştırma hakkında daha fazla bilgi için Senkronizasyon Bağdaştırıcısı Çalıştırma dersine göz atın

Aşağıdaki örnekte, tek bir yer tutucu hesap kullanan ve yalnızca indirme işlemleri yapan bir senkronizasyon bağdaştırıcısının XML'i gösterilmektedir.

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:contentAuthority="com.example.android.datasync.provider"
        android:accountType="com.android.example.datasync"
        android:userVisible="false"
        android:supportsUploading="false"
        android:allowParallelSyncs="false"
        android:isAlwaysSyncable="true"/>

Manifest'te senkronizasyon bağdaştırıcısını bildirme

Senkronizasyon bağdaştırıcısı bileşenini uygulamanıza ekledikten sonra, bileşenin kullanımıyla ilgili izinleri istemeniz ve eklediğiniz Service sınırını bildirmeniz gerekir.

Senkronizasyon bağdaştırıcısı bileşeni, ağ ile cihaz arasında veri aktaran kodu çalıştırdığından internete erişim izni istemeniz gerekir. Ayrıca, uygulamanızın senkronizasyon bağdaştırıcısı ayarlarını okuma ve yazma izni istemesi gerekir. Böylece, senkronizasyon bağdaştırıcısını uygulamanızdaki diğer bileşenlerden programatik olarak kontrol edebilirsiniz. Ayrıca, uygulamanızın Sub Authenticator oluşturma bölümünde oluşturduğunuz kimlik doğrulayıcı bileşenini kullanmasına olanak tanıyan özel bir izin de istemeniz gerekir.

Bu izinleri istemek için aşağıdakileri uygulama manifestinize <manifest> alt öğeleri olarak ekleyin:

android.permission.INTERNET
Senkronizasyon bağdaştırıcısı kodunun cihazdan sunucuya veri indirebilmesi veya sunucuya veri yükleyebilmesi için internete erişmesine izin verir. Bu izni daha önce istediyseniz tekrar eklemeniz gerekmez.
android.permission.READ_SYNC_SETTINGS
Uygulamanızın mevcut senkronizasyon adaptörü ayarlarını okumasına izin verir. Örneğin, getIsSyncable() yöntemini çağırmak için bu izne ihtiyacınız var.
android.permission.WRITE_SYNC_SETTINGS
Uygulamanızın, senkronizasyon adaptörü ayarlarını kontrol etmesine izin verir. addPeriodicSync() kullanarak periyodik senkronizasyon bağdaştırıcısı çalıştırmalarını ayarlamak için bu izne ihtiyacınız var. requestSync() yöntemini çağırmak için bu izin gerekmez. Senkronizasyon bağdaştırıcısını çalıştırma hakkında daha fazla bilgi edinmek için Senkronizasyon Bağdaştırıcısı Çalıştırma bölümüne bakın.

Aşağıdaki snippet'te izinlerin nasıl ekleneceği gösterilmektedir:

<manifest>
...
    <uses-permission
            android:name="android.permission.INTERNET"/>
    <uses-permission
            android:name="android.permission.READ_SYNC_SETTINGS"/>
    <uses-permission
            android:name="android.permission.WRITE_SYNC_SETTINGS"/>
    <uses-permission
            android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
...
</manifest>

Son olarak, çerçevenin senkronizasyon bağdaştırıcınızla etkileşim kurmak için kullandığı sınırlı Service öğesini bildirmek için aşağıdaki XML'i uygulama manifestinize <application> alt öğesi olarak ekleyin:

        <service
                android:name="com.example.android.datasync.SyncService"
                android:exported="false"
                android:process=":sync">
            <intent-filter>
                <action android:name="android.content.SyncAdapter"/>
            </intent-filter>
            <meta-data android:name="android.content.SyncAdapter"
                    android:resource="@xml/syncadapter" />
        </service>

<intent-filter> öğesi, senkronizasyon bağdaştırıcısını çalıştırmak için sistem tarafından gönderilen android.content.SyncAdapter amaç işlemi tarafından tetiklenen bir filtre oluşturur. Filtre tetiklendiğinde, sistem oluşturduğunuz bağlı hizmeti (bu örnekte SyncService) başlatır. android:exported="false" özelliği, yalnızca uygulamanızın ve sistemin Service'a erişmesine izin verir. android:process=":sync" özelliği, sisteme Service özelliğini sync adlı genel bir paylaşılan işlemde çalıştırmasını bildirir. Uygulamanızda birden fazla senkronizasyon bağdaştırıcısı varsa bunlar bu işlemi paylaşabilir. Bu da ek yükü azaltır.

<meta-data> öğesi, daha önce oluşturduğunuz senkronizasyon bağdaştırıcısı meta veri XML dosyasının adını sağlar. android:name özelliği, bu meta verinin senkronizasyon bağdaştırıcısı çerçevesi için olduğunu belirtir. android:resource öğesi, meta veri dosyasının adını belirtir.

Artık senkronizasyon adaptörünüzün tüm bileşenlerine sahipsiniz. Bir sonraki derste, senkronizasyon bağdaştırıcısı çerçevesine bir etkinliğe yanıt olarak veya düzenli bir plana göre senkronizasyon bağdaştırıcınızı çalıştırmasını nasıl bildireceğiniz gösterilmektedir.