یک آداپتور همگام سازی ایجاد کنید

توجه: ما WorkManager را به عنوان راه حل توصیه شده برای اکثر موارد استفاده از پردازش پس زمینه توصیه می کنیم. لطفاً به راهنمای پردازش پس‌زمینه مراجعه کنید تا بدانید کدام راه‌حل برای شما مناسب‌تر است.

مؤلفه آداپتور همگام‌سازی در برنامه شما، کد کارهایی را که داده‌ها را بین دستگاه و سرور منتقل می‌کنند، دربر می‌گیرد. بر اساس زمان‌بندی و محرک‌هایی که در برنامه خود ارائه می‌دهید، چارچوب آداپتور همگام‌سازی کد را در مؤلفه آداپتور همگام‌سازی اجرا می‌کند. برای افزودن یک جزء آداپتور همگام‌سازی به برنامه خود، باید قطعات زیر را اضافه کنید:

کلاس آداپتور همگام سازی
کلاسی که کد انتقال داده شما را در یک رابط سازگار با چارچوب آداپتور همگام سازی قرار می دهد.
Service محدود.
مؤلفه‌ای که به چارچوب آداپتور همگام‌سازی اجازه می‌دهد کد را در کلاس آداپتور همگام‌سازی شما اجرا کند.
همگام سازی فایل فراداده XML آداپتور.
فایلی حاوی اطلاعات مربوط به آداپتور همگام سازی شما. چارچوب این فایل را می‌خواند تا نحوه بارگیری و زمان‌بندی انتقال داده را بیابد.
اعلامیه ها در مانیفست برنامه
XML که سرویس محدود شده را اعلام می کند و به همگام سازی ابرداده های مخصوص آداپتور اشاره می کند.

این درس به شما نشان می دهد که چگونه این عناصر را تعریف کنید.

یک کلاس آداپتور همگام سازی ایجاد کنید

در این بخش از درس یاد می گیرید که چگونه کلاس آداپتور همگام سازی را ایجاد کنید که کد انتقال داده را محصور می کند. ایجاد کلاس شامل گسترش کلاس پایه آداپتور همگام سازی، تعریف سازنده برای کلاس و پیاده سازی روشی است که در آن وظایف انتقال داده را تعریف می کنید.

کلاس آداپتور همگام سازی پایه را گسترش دهید

برای ایجاد مؤلفه آداپتور همگام‌سازی، با گسترش AbstractThreadedSyncAdapter و نوشتن سازنده‌های آن شروع کنید. از سازنده‌ها برای اجرای وظایف راه‌اندازی هر بار که مؤلفه آداپتور همگام‌سازی شما از ابتدا ایجاد می‌شود، استفاده کنید، همانطور که از Activity.onCreate() برای تنظیم یک فعالیت استفاده می‌کنید. به عنوان مثال، اگر برنامه شما از یک ارائه دهنده محتوا برای ذخیره داده ها استفاده می کند، از سازنده ها برای دریافت نمونه ContentResolver استفاده کنید. از آنجایی که فرم دوم سازنده در پلتفرم اندروید نسخه 3.0 برای پشتیبانی از آرگومان parallelSyncs اضافه شده است، برای حفظ سازگاری باید دو شکل از سازنده ایجاد کنید.

توجه: چارچوب آداپتور همگام‌سازی برای کار با اجزای آداپتور همگام‌سازی طراحی شده است که نمونه‌های تکی هستند. نمونه‌سازی جزء آداپتور همگام‌سازی با جزئیات بیشتری در بخش اتصال آداپتور همگام‌سازی به چارچوب ارائه شده است.

مثال زیر نحوه پیاده سازی AbstractThreadedSyncAdapter و سازنده های آن را به شما نشان می دهد:

کاتلین

/**
 * 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) {
    ...
}

جاوا

/**
 * 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();
        ...
    }

کد انتقال داده را اضافه کنید

جزء آداپتور همگام سازی به طور خودکار انتقال داده را انجام نمی دهد. در عوض، کد انتقال داده شما را کپسوله می‌کند تا چارچوب آداپتور همگام‌سازی بتواند بدون دخالت برنامه شما، انتقال داده را در پس‌زمینه اجرا کند. وقتی فریم ورک آماده همگام سازی داده های برنامه شما است، پیاده سازی متد onPerformSync() را فراخوانی می کند.

برای تسهیل انتقال داده از کد برنامه اصلی شما به مؤلفه آداپتور همگام‌سازی، چارچوب آداپتور همگام‌سازی onPerformSync() با آرگومان‌های زیر فراخوانی می‌کند:

حساب
یک شیء Account مرتبط با رویدادی که آداپتور همگام‌سازی را راه‌اندازی کرد. اگر سرور شما از حساب‌ها استفاده نمی‌کند، نیازی به استفاده از اطلاعات این شی نیست.
موارد اضافی
Bundle حاوی پرچم‌های ارسال شده توسط رویدادی که آداپتور همگام‌سازی را فعال کرد.
اختیار
اختیار یک ارائه دهنده محتوا در سیستم. برنامه شما باید به این ارائه دهنده دسترسی داشته باشد. معمولاً، مرجع مربوط به ارائه‌دهنده محتوا در برنامه خودتان است.
مشتری ارائه دهنده محتوا
یک ContentProviderClient برای ارائه‌دهنده محتوا که با استدلال مرجع به آن اشاره می‌کند. ContentProviderClient یک رابط عمومی سبک وزن برای یک ارائه دهنده محتوا است. این همان عملکرد اولیه ContentResolver را دارد. اگر از یک ارائه دهنده محتوا برای ذخیره داده های برنامه خود استفاده می کنید، می توانید با این شی به ارائه دهنده متصل شوید. در غیر این صورت، می توانید آن را نادیده بگیرید.
همگام سازی نتیجه
یک شی SyncResult که برای ارسال اطلاعات به چارچوب آداپتور همگام سازی استفاده می کنید.

قطعه زیر ساختار کلی onPerformSync() را نشان می دهد:

کاتلین

/*
 * 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.
     */
}

جاوا

/*
 * 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() به الزامات همگام سازی داده های برنامه شما و پروتکل های اتصال سرور اختصاص دارد، چند کار کلی وجود دارد که پیاده سازی شما باید انجام دهد:

اتصال به سرور
اگرچه می توانید فرض کنید که شبکه در هنگام شروع انتقال داده در دسترس است، چارچوب آداپتور همگام سازی به طور خودکار به یک سرور متصل نمی شود.
دانلود و آپلود داده ها
یک آداپتور همگام‌سازی هیچ کار انتقال داده را خودکار نمی‌کند. اگر می‌خواهید داده‌ها را از یک سرور دانلود کنید و در یک ارائه‌دهنده محتوا ذخیره کنید، باید کدی را ارائه کنید که داده‌ها را درخواست می‌کند، آن‌ها را دانلود می‌کند و در ارائه‌دهنده درج می‌کند. به همین ترتیب، اگر می خواهید داده ها را به یک سرور ارسال کنید، باید آنها را از یک فایل، پایگاه داده یا ارائه دهنده بخوانید و درخواست آپلود لازم را ارسال کنید. همچنین باید خطاهای شبکه ای را که در حین انجام انتقال داده رخ می دهد، کنترل کنید.
رسیدگی به تضاد داده ها یا تعیین میزان فعلی بودن داده ها
یک آداپتور همگام‌سازی به‌طور خودکار تداخل بین داده‌های روی سرور و داده‌های روی دستگاه را کنترل نمی‌کند. همچنین، به‌طور خودکار تشخیص نمی‌دهد که داده‌های روی سرور جدیدتر از داده‌های روی دستگاه هستند یا برعکس. در عوض، شما باید الگوریتم های خود را برای مدیریت این وضعیت ارائه دهید.
پاک کن
همیشه اتصالات را به سرور ببندید و فایل‌های موقت و حافظه پنهان را در پایان انتقال داده‌تان پاک کنید.

توجه: چارچوب آداپتور همگام‌سازی onPerformSync() روی یک رشته پس‌زمینه اجرا می‌شود، بنابراین نیازی نیست پردازش پس‌زمینه خود را تنظیم کنید.

علاوه بر وظایف مرتبط با همگام سازی خود، باید سعی کنید وظایف معمولی مرتبط با شبکه خود را ترکیب کرده و به onPerformSync() اضافه کنید. با متمرکز کردن تمام وظایف شبکه خود در این روش، انرژی باتری مورد نیاز برای راه اندازی و توقف رابط های شبکه را حفظ می کنید. برای کسب اطلاعات بیشتر در مورد کارآمدتر کردن دسترسی به شبکه، به کلاس آموزشی انتقال داده بدون تخلیه باتری مراجعه کنید، که چندین کار دسترسی به شبکه را توضیح می دهد که می توانید در کد انتقال داده خود بگنجانید.

آداپتور همگام سازی را به چارچوب متصل کنید

شما اکنون کد انتقال داده خود را در یک جزء آداپتور همگام سازی کپسوله کرده اید، اما باید چارچوبی را برای دسترسی به کد خود فراهم کنید. برای انجام این کار، باید یک Service محدود ایجاد کنید که یک شی بایندر مخصوص اندروید را از مؤلفه آداپتور همگام‌سازی به فریمورک ارسال می‌کند. با این شی بایندر، فریم ورک می تواند متد onPerformSync() را فراخوانی کند و داده ها را به آن ارسال کند.

جزء آداپتور همگام سازی خود را به صورت تکی در متد onCreate() سرویس نمونه سازی کنید. با نمونه سازی کامپوننت در onCreate() ، ایجاد آن را تا شروع سرویس به تعویق می اندازید، که زمانی اتفاق می افتد که فریم ورک برای اولین بار سعی می کند انتقال داده شما را اجرا کند. در صورتی که چارچوب آداپتور همگام‌سازی چندین اجرا از آداپتور همگام‌سازی شما را در پاسخ به محرک‌ها یا برنامه‌ریزی‌ها در صف قرار دهد، باید مؤلفه را به روشی ایمن نمونه‌سازی کنید.

به عنوان مثال، قطعه زیر به شما نشان می‌دهد که چگونه کلاسی ایجاد کنید که Service محدود را پیاده‌سازی کند، مؤلفه آداپتور همگام‌سازی شما را نمونه‌سازی کند و شی بایندر Android را دریافت کند:

کاتلین

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()
    }
}

جاوا

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();
    }
}

توجه: برای مشاهده نمونه دقیق‌تر یک سرویس محدود برای یک آداپتور همگام‌سازی، به برنامه نمونه مراجعه کنید.

حساب مورد نیاز چارچوب را اضافه کنید

چارچوب آداپتور همگام‌سازی نیاز دارد که هر آداپتور همگام‌سازی یک نوع حساب داشته باشد. شما مقدار نوع حساب را در بخش Add the Authenticator Metadata File اعلام کردید. حال باید این نوع حساب را در سیستم اندروید راه اندازی کنید. برای تنظیم نوع حساب، با فراخوانی addAccountExplicitly() یک حساب نگهدارنده اضافه کنید که از نوع حساب استفاده می کند.

بهترین مکان برای فراخوانی متد، متد onCreate() مربوط به فعالیت باز کردن برنامه شما است. قطعه کد زیر نحوه انجام این کار را به شما نشان می دهد:

کاتلین

...
// 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.
                 */
            }
        }
    }
    ...
}

جاوا

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.
             */
        }
    }
    ...
}

فایل فوق داده آداپتور همگام سازی را اضافه کنید

برای وصل کردن مؤلفه آداپتور همگام‌سازی خود به چارچوب، باید فریم ورک را با ابرداده‌هایی که مؤلفه را توصیف می‌کند و پرچم‌های اضافی ارائه می‌کند، ارائه دهید. ابرداده نوع حسابی را که برای آداپتور همگام‌سازی خود ایجاد کرده‌اید مشخص می‌کند، یک مرجع ارائه‌دهنده محتوا مرتبط با برنامه شما را اعلام می‌کند، بخشی از رابط کاربری سیستم مربوط به آداپتورهای همگام‌سازی را کنترل می‌کند، و سایر پرچم‌های مرتبط با همگام‌سازی را اعلام می‌کند. این ابرداده را در یک فایل XML ویژه ذخیره شده در پوشه /res/xml/ در پروژه برنامه خود اعلام کنید. می‌توانید هر نامی را به فایل بدهید، اگرچه معمولاً syncadapter.xml نامیده می‌شود.

این فایل XML حاوی یک عنصر XML منفرد <sync-adapter> است که دارای ویژگی های زیر است:

android:contentAuthority
مرجع URI برای ارائه دهنده محتوای شما. اگر در درس قبلی ارائه‌دهنده محتوای خرد برای برنامه خود ایجاد کرده‌اید، از مقداری که برای ویژگی android:authorities در عنصر <provider> به مانیفست برنامه خود اضافه کرده‌اید، استفاده کنید. این ویژگی با جزئیات بیشتر در بخش اعلام ارائه دهنده در مانیفست توضیح داده شده است.
اگر با آداپتور همگام‌سازی داده‌ها را از یک ارائه‌دهنده محتوا به یک سرور منتقل می‌کنید، این مقدار باید همان مرجع URI محتوایی باشد که برای آن داده استفاده می‌کنید. این مقدار همچنین یکی از مقاماتی است که در ویژگی android:authorities عنصر <provider> مشخص می‌کنید که ارائه‌دهنده شما را در مانیفست برنامه شما اعلام می‌کند.
android:accountType
نوع حساب مورد نیاز چارچوب آداپتور همگام‌سازی. مقدار باید همان مقدار نوع حسابی باشد که هنگام ایجاد فایل فراداده authenticator ارائه کردید، همانطور که در بخش افزودن فایل فراداده Authenticator توضیح داده شده است. همچنین مقداری است که برای ACCOUNT_TYPE ثابت در قطعه کد در بخش Add the Account Required by Framework مشخص کرده‌اید.
ویژگی های تنظیمات
android:userVisible
نمایان بودن نوع حساب آداپتور همگام‌سازی را تنظیم می‌کند. به طور پیش‌فرض، نماد حساب و برچسب مرتبط با نوع حساب در بخش حساب‌ها در برنامه تنظیمات سیستم قابل مشاهده است، بنابراین باید آداپتور همگام‌سازی خود را نامرئی کنید، مگر اینکه نوع حساب یا دامنه‌ای داشته باشید که به راحتی با برنامه شما مرتبط شود. اگر نوع حساب خود را نامرئی کنید، همچنان می توانید به کاربران اجازه دهید آداپتور همگام سازی شما را با یک رابط کاربری در یکی از فعالیت های برنامه شما کنترل کنند.
android:supportsUploading
به شما امکان می دهد داده ها را در فضای ابری آپلود کنید. اگر برنامه شما فقط داده را دانلود می کند، این را روی false تنظیم کنید.
android:allowParallelSyncs
به چند نمونه از مؤلفه آداپتور همگام‌سازی شما اجازه می‌دهد تا همزمان اجرا شوند. اگر برنامه شما از چندین حساب کاربری پشتیبانی می کند و می خواهید به چندین کاربر اجازه دهید داده ها را به صورت موازی انتقال دهند، از این استفاده کنید. اگر هرگز چندین انتقال داده را اجرا نکنید، این پرچم هیچ تاثیری ندارد.
android:isAlwaysSyncable
به چارچوب آداپتور همگام سازی نشان می دهد که می تواند آداپتور همگام سازی شما را در هر زمانی که شما مشخص کرده اید اجرا کند. اگر می‌خواهید زمانی که آداپتور همگام‌سازی شما می‌تواند اجرا شود را به صورت برنامه‌نویسی کنترل کنید، این پرچم را روی false تنظیم کنید و سپس requestSync() برای اجرای آداپتور همگام‌سازی فراخوانی کنید. برای کسب اطلاعات بیشتر در مورد اجرای یک آداپتور همگام‌سازی، به درس اجرای یک آداپتور همگام‌سازی مراجعه کنید

مثال زیر XML را برای یک آداپتور همگام‌سازی نشان می‌دهد که از یک حساب نگهدارنده تکی استفاده می‌کند و فقط دانلود می‌کند.

<?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"/>

آداپتور همگام سازی را در مانیفست اعلام کنید

هنگامی که مؤلفه آداپتور همگام‌سازی را به برنامه خود اضافه کردید، باید مجوزهای مربوط به استفاده از مؤلفه را درخواست کنید و باید Service محدودی را که اضافه کرده‌اید اعلام کنید.

از آنجایی که مؤلفه آداپتور همگام‌سازی کدی را اجرا می‌کند که داده‌ها را بین شبکه و دستگاه منتقل می‌کند، باید برای دسترسی به اینترنت مجوز درخواست کنید. علاوه بر این، برنامه شما نیاز به درخواست مجوز برای خواندن و نوشتن تنظیمات آداپتور همگام‌سازی دارد، بنابراین می‌توانید آداپتور همگام‌سازی را به صورت برنامه‌ریزی از سایر اجزای برنامه خود کنترل کنید. همچنین باید یک مجوز ویژه درخواست کنید که به برنامه شما امکان می‌دهد از مؤلفه احراز هویتی که در درس ایجاد یک احراز هویت خرد ایجاد کرده‌اید استفاده کند.

برای درخواست این مجوزها، موارد زیر را به عنوان عناصر فرزند <manifest> به مانیفست برنامه خود اضافه کنید:

android.permission.INTERNET
به کد آداپتور همگام‌سازی اجازه دسترسی به اینترنت را می‌دهد تا بتواند داده‌ها را از دستگاه به سرور بارگیری یا آپلود کند. اگر قبلاً آن را درخواست کرده بودید، نیازی به اضافه کردن مجدد این مجوز ندارید.
android.permission.READ_SYNC_SETTINGS
به برنامه شما اجازه می‌دهد تا تنظیمات آداپتور همگام‌سازی فعلی را بخواند. برای مثال، برای فراخوانی getIsSyncable() به این مجوز نیاز دارید.
android.permission.WRITE_SYNC_SETTINGS
به برنامه شما اجازه می‌دهد تنظیمات آداپتور همگام‌سازی را کنترل کند. برای تنظیم اجرای آداپتور همگام سازی دوره ای با استفاده از addPeriodicSync() به این مجوز نیاز دارید. برای فراخوانی requestSync() به این مجوز نیازی نیست . برای کسب اطلاعات بیشتر در مورد اجرای آداپتور همگام‌سازی، به اجرای آداپتور همگام‌سازی مراجعه کنید.

قطعه زیر نحوه اضافه کردن مجوزها را نشان می دهد:

<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>

در نهایت، برای اعلام Service محدود که چارچوب برای تعامل با آداپتور همگام‌سازی شما استفاده می‌کند، XML زیر را به عنوان عنصر فرزند <application> به مانیفست برنامه خود اضافه کنید:

        <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> فیلتری را تنظیم می‌کند که توسط اقدام intent android.content.SyncAdapter ایجاد می‌شود که توسط سیستم برای اجرای آداپتور همگام‌سازی ارسال می‌شود. هنگامی که فیلتر فعال می شود، سیستم سرویس باندی را که ایجاد کرده اید راه اندازی می کند که در این مثال SyncService است. ویژگی android:exported="false" فقط به برنامه و سیستم شما اجازه دسترسی به Service می دهد. ویژگی android:process=":sync" به سیستم می گوید که Service در یک فرآیند مشترک جهانی به نام sync اجرا کند. اگر چندین آداپتور همگام‌سازی در برنامه خود دارید، می‌توانند این فرآیند را به اشتراک بگذارند، که باعث کاهش هزینه‌های اضافی می‌شود.

عنصر <meta-data> نام فایل XML ابرداده آداپتور همگام‌سازی را که قبلاً ایجاد کرده‌اید، ارائه می‌کند. ویژگی android:name نشان می دهد که این ابرداده برای چارچوب آداپتور همگام سازی است. عنصر android:resource نام فایل فراداده را مشخص می کند.

اکنون همه اجزای آداپتور همگام سازی خود را دارید. درس بعدی به شما نشان می‌دهد که چگونه به چارچوب آداپتور همگام‌سازی بگویید که آداپتور همگام‌سازی شما را اجرا کند، چه در پاسخ به یک رویداد یا در یک برنامه منظم.