सिंक अडैप्टर बनाना

ध्यान दें: हमारा सुझाव है कि आप WorkManager को का सुझाव दिया जाता है. कृपया बैकग्राउंड प्रोसेसिंग गाइड देखें और जानें कि आपके लिए कौनसा तरीका सबसे अच्छा है.

आपके ऐप्लिकेशन का सिंक अडैप्टर कॉम्पोनेंट, ट्रांसफ़र किए जाने वाले कामों के लिए कोड को एन्क्रिप्ट (सुरक्षित) करता है डिवाइस और सर्वर के बीच का डेटा. आपके दिए गए शेड्यूल और ट्रिगर के आधार पर तो आपके ऐप्लिकेशन के साथ सिंक अडैप्टर फ़्रेमवर्क, सिंक अडैप्टर कॉम्पोनेंट में कोड चलाता है. किसी कीवर्ड को सिंक अडैप्टर कॉम्पोनेंट को अपने ऐप्लिकेशन से सिंक करने के लिए, आपको ये चीज़ें जोड़नी होंगी:

अडैप्टर क्लास सिंक करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ऐसी क्लास जो आपके डेटा ट्रांसफ़र कोड को ऐसे इंटरफ़ेस में रैप करती है जो सिंक अडैप्टर के साथ काम करता है फ़्रेमवर्क शामिल है.
Service तक सीमित.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एक ऐसा कॉम्पोनेंट जो सिंक अडैप्टर फ़्रेमवर्क को, सिंक अडैप्टर में कोड चलाने की अनुमति देता है क्लास.
अडैप्टर की एक्सएमएल मेटाडेटा फ़ाइल को सिंक करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस फ़ाइल में आपके सिंक अडैप्टर के बारे में जानकारी होती है. फ़्रेमवर्क इस फ़ाइल को अपने डेटा ट्रांसफ़र को लोड और शेड्यूल करने का तरीका जानें.
ऐप्लिकेशन मेनिफ़ेस्ट में किए गए एलान.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एक्सएमएल, जो सीमित सेवा के बारे में जानकारी देती है और अडैप्टर के खास मेटाडेटा को सिंक करने की ओर इशारा करती है.

इस लेसन में इन एलिमेंट को तय करने का तरीका बताया गया है.

सिंक अडैप्टर क्लास बनाना

लेसन के इस हिस्से में, आपको यह सीखने का मौका मिलेगा कि एक सिंक अडैप्टर क्लास कैसे बनाई जाती है. इस क्लास में, डेटा ट्रांसफ़र कोड. क्लास बनाने में, सिंक अडैप्टर बेस क्लास को बढ़ाना शामिल है क्लास के लिए कंस्ट्रक्टर सेट कर सकते हैं और उस तरीके को लागू कर सकते हैं जहां आप डेटा ट्रांसफ़र तय करते हैं टास्क.

बेस सिंक अडैप्टर क्लास को बढ़ाएं

सिंक अडैप्टर कॉम्पोनेंट बनाने के लिए, एक्सटेंड करके शुरू करें AbstractThreadedSyncAdapter और इसके कंस्ट्रक्टर लिख रहे हैं. इसका इस्तेमाल करें कंस्ट्रक्टर, इनसे आपका सिंक अडैप्टर कॉम्पोनेंट बनाए जाने पर हर बार सेटअप टास्क चलाने में मदद करते हैं ठीक वैसे ही, जैसे आप Activity.onCreate() का उपयोग करके गतिविधि. उदाहरण के लिए, अगर आपका ऐप्लिकेशन डेटा स्टोर करने के लिए कॉन्टेंट देने वाले का इस्तेमाल करता है, तो कंस्ट्रक्टर का इस्तेमाल करें ContentResolver इंस्टेंस पाने के लिए. Google के दूसरे संगठन ने parallelSyncs के साथ काम करने के लिए, Android प्लैटफ़ॉर्म के वर्शन 3.0 में कंस्ट्रक्टर जोड़ा गया था आर्ग्युमेंट के तौर पर, आपको कंस्ट्रक्टर के दो फ़ॉर्म बनाने होंगे, ताकि कंपैटबिलिटी बनाए रखी जा सके.

ध्यान दें: सिंक अडैप्टर फ़्रेमवर्क को इस तरह से डिज़ाइन किया गया है कि यह सिंक अडैप्टर के साथ काम करता है. कॉम्पोनेंट, जो सिंगलटन इंस्टेंस होते हैं. सिंक अडैप्टर कॉम्पोनेंट को इंस्टैंशिएट करने की प्रोसेस कवर की गई है ज़्यादा जानकारी पाने के लिए, सिंक अडैप्टर को फ़्रेमवर्क से बाइंड करें.

नीचे दिए गए उदाहरण में, AbstractThreadedSyncAdapterऔर इसके कंस्ट्रक्टर:

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

डेटा ट्रांसफ़र कोड जोड़ना

सिंक अडैप्टर कॉम्पोनेंट, अपने-आप डेटा ट्रांसफ़र नहीं करता है. इसके बजाय, आपके डेटा ट्रांसफ़र कोड को इनकैप्सुलेट करता है, ताकि सिंक अडैप्टर फ़्रेमवर्क बैकग्राउंड में डेटा ट्रांसफ़र करने की सुविधा मिलती है. यह डेटा आपके ऐप्लिकेशन से जुड़े बिना ही ट्रांसफ़र किया जाता है. फ़्रेमवर्क तैयार होने पर का डेटा सिंक करने के लिए करते हैं, तो यह आपके तरीके को लागू करने की प्रोसेस शुरू करता है. onPerformSync().

अपने मुख्य ऐप्लिकेशन कोड से सिंक अडैप्टर कॉम्पोनेंट में डेटा ट्रांसफ़र करने के लिए, सिंक अडैप्टर फ़्रेमवर्क कॉल onPerformSync() इन आर्ग्युमेंट का इस्तेमाल करें:

खाता
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ट्रिगर हुए इवेंट से जुड़ा Account ऑब्जेक्ट सिंक अडैप्टर. अगर आपका सर्वर खातों का इस्तेमाल नहीं करता है, तो आपको इस ऑब्जेक्ट में दी गई जानकारी.
बोनस वीडियो
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है Bundle में, सिंक शुरू करने वाले इवेंट से भेजे गए फ़्लैग शामिल हैं अडैप्टर.
अधिकार
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सिस्टम में कॉन्टेंट देने वाले का अधिकार. आपके ऐप्लिकेशन के पास यह कंपनी. आम तौर पर, अधिकार आपके ऐप्लिकेशन में कॉन्टेंट देने वाले से जुड़े होते हैं.
कॉन्टेंट देने वाला क्लाइंट
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कॉन्टेंट देने वाले के लिए एक ContentProviderClient, जिसके बारे में सर्टिफ़िकेट देने वाली संस्था या निकाय का तर्क. ContentProviderClient एक लाइटवेट पब्लिक है एक कॉन्टेंट देने वाले के लिए. यह ब्राउज़र में मौजूद ContentResolver. अगर डेटा स्टोर करने के लिए कॉन्टेंट देने वाले किसी व्यक्ति या कंपनी का इस्तेमाल किया जा रहा है, तो है, तो इस ऑब्जेक्ट की मदद से सेवा देने वाली कंपनी से कनेक्ट किया जा सकता है. अगर आपको ऐसा नहीं करना है, तो इसे.
सिंक का नतीजा
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है SyncResult ऑब्जेक्ट, जिसका इस्तेमाल सिंक करने के लिए जानकारी भेजने के लिए किया जाता है अडैप्टर फ़्रेमवर्क.

नीचे दिए गए स्निपेट में, onPerformSync():

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() खास तौर पर इनके लिए है डेटा सिंक करने से जुड़ी ज़रूरी शर्तें और सर्वर कनेक्शन प्रोटोकॉल ऐसे सामान्य काम जिन्हें लागू करने की प्रोसेस को पूरा करना चाहिए:

सर्वर से कनेक्ट करना
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है हालांकि, आपके पास यह मान लेने का विकल्प होता है कि आपका डेटा ट्रांसफ़र शुरू होने के बाद नेटवर्क उपलब्ध है, लेकिन सिंक अडैप्टर फ़्रेमवर्क, किसी सर्वर से अपने-आप कनेक्ट नहीं होता.
डेटा डाउनलोड और अपलोड करना
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सिंक अडैप्टर, डेटा ट्रांसफ़र के किसी भी टास्क को अपने-आप नहीं करता. अगर आपको अपना ऐप्लिकेशन डाउनलोड करना है, तो डेटा इकट्ठा किया होता है और उसे किसी कॉन्टेंट प्रोवाइडर में सेव किया जाता है, तो आपको वह कोड देना होगा जो डेटा का अनुरोध करता है, उसे डाउनलोड करता है, और उसे सेवा देने वाली कंपनी में डाल देता है. इसी तरह, अगर आप किसी सर्वर पर डेटा भेजें, तो आपको उसे किसी फ़ाइल, डेटाबेस या सेवा देने वाली कंपनी से पढ़ना होगा और अपलोड करने के लिए ज़रूरी अनुरोध. आपको नेटवर्क की उन गड़बड़ियों को भी हैंडल करना होगा जो आपके ऐप्लिकेशन के डेटा ट्रांसफ़र हो रहा है.
डेटा के विवादों को मैनेज करना या यह तय करना कि डेटा कितना नया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सिंक अडैप्टर, सर्वर पर मौजूद डेटा और डेटा के बीच होने वाले विवादों को अपने-आप हैंडल नहीं करता डिवाइस पर. साथ ही, यह अपने-आप यह पता नहीं लगा पाता कि सर्वर पर मौजूद डेटा या इसके विपरीत. इसके बजाय, आपको समस्या से निपटने में मदद मिलेगी.
स्टोरेज खाली करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है हमेशा सर्वर से कनेक्शन बंद करें और इनके आखिर में अस्थायी वाली फ़ाइलें और कैश मेमोरी मिटाएं आपका डेटा ट्रांसफ़र किया जाता है.

ध्यान दें: सिंक अडैप्टर फ़्रेमवर्क चलता है onPerformSync() बैकग्राउंड थ्रेड का इस्तेमाल किया जा सकता है, ताकि आपको बैकग्राउंड प्रोसेसिंग सेट अप करने की ज़रूरत न पड़े.

सिंक से जुड़े कामों के अलावा, आपको अपने सामान्य बदलावों को एक साथ जोड़ने की कोशिश करनी चाहिए नेटवर्क से जुड़े टास्क करें और उन्हें onPerformSync(). इस तरीके में अपने सभी नेटवर्क काम को ध्यान में रखकर, आप इस तरह की बैटरी पावर की बचत करते हैं को नेटवर्क इंटरफ़ेस को चालू और बंद करने की ज़रूरत होती है. नेटवर्क का ऐक्सेस देने के बारे में ज़्यादा जानने के लिए बेहतर तरीके से काम करने के लिए, ट्रेनिंग क्लास बैटरी को पूरा किए बिना डेटा ट्रांसफ़र करना देखें. इसमें नेटवर्क के अलग-अलग ऐक्सेस के बारे में बताया गया है ऐसे टास्क जिन्हें अपने डेटा ट्रांसफ़र कोड में शामिल किया जा सकता है.

सिंक अडैप्टर को फ़्रेमवर्क से बाइंड करें

अब आपका डेटा ट्रांसफ़र कोड, सिंक अडैप्टर कॉम्पोनेंट में एनकैप्सुलेट किया गया है, लेकिन का इस्तेमाल करें. ऐसा करने के लिए, आपको एक बाउंड बनाना होगा Service जो सिंक अडैप्टर से एक खास Android बाइंडर ऑब्जेक्ट पास करता है कॉम्पोनेंट को फ़्रेमवर्क में शामिल करना. इस बाइंडर ऑब्जेक्ट के साथ, फ़्रेमवर्क onPerformSync() तरीका और उसे डेटा भेजें.

अपने सिंक अडैप्टर कॉम्पोनेंट को सिंगलटन के रूप में, सेवा का onCreate() तरीका. इंस्टैंशिएट करके onCreate() में कॉम्पोनेंट है, तो इसे तब तक बनाया जाता है, जब तक सेवा शुरू नहीं होती. ऐसा तब होता है, जब फ़्रेमवर्क पहली बार आपके डेटा ट्रांसफ़र करते हैं. आपको कॉम्पोनेंट को थ्रेड-सुरक्षित तरीके से इंस्टैंशिएट करना होगा, ताकि अडैप्टर फ़्रेमवर्क, ट्रिगर की प्रतिक्रिया के रिस्पॉन्स में आपके सिंक एडॉप्टर के कई निष्पादनों को कतारबद्ध करता है या शेड्यूल करने.

उदाहरण के लिए, नीचे दिया गया स्निपेट आपको एक ऐसी क्लास बनाने का तरीका बताता है, जो बाउंड Service, आपके सिंक अडैप्टर कॉम्पोनेंट को इंस्टैंशिएट करता है और Android बाइंडर ऑब्जेक्ट:

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

ध्यान दें: सिंक अडैप्टर के लिए बाउंड सेवा का ज़्यादा जानकारी वाला उदाहरण देखने के लिए, सैंपल के तौर पर मिले ऐप्लिकेशन देखें.

फ़्रेमवर्क के मुताबिक ज़रूरी खाता जोड़ें

सिंक अडैप्टर फ़्रेमवर्क के लिए, हर सिंक अडैप्टर में खाता टाइप का होना ज़रूरी है. आपने एलान किया सेक्शन में मौजूद खाता टाइप की वैल्यू Authenticator की मेटाडेटा फ़ाइल जोड़ें. अब आपको इसमें इस खाता टाइप को सेट अप करना होगा: Android सिस्टम. खाता टाइप सेट अप करने के लिए, ऐसा प्लेसहोल्डर खाता जोड़ें जो इस तरह के खाते का इस्तेमाल करता हो addAccountExplicitly() पर कॉल करके.

विधि को कॉल करने का सबसे अच्छा स्थान यह है कि आपके ऐप्लिकेशन की onCreate() विधि शुरुआती गतिविधि. नीचे दिया गया कोड स्निपेट आपको इसका तरीका बताता है:

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

सिंक अडैप्टर मेटाडेटा फ़ाइल जोड़ें

अपने सिंक अडैप्टर कॉम्पोनेंट को फ़्रेमवर्क में प्लग करने के लिए, आपको फ़्रेमवर्क उपलब्ध कराना होगा उस मेटाडेटा के साथ जो कॉम्पोनेंट का ब्यौरा देता है और ज़्यादा फ़्लैग करता है. मेटाडेटा बताता है कि आपके ज़रिए सिंक अडैप्टर के लिए बनाया गया खाता टाइप. यह कॉन्टेंट देने वाली संस्था या निकाय का एलान करता है जो आपके ऐप्लिकेशन से जुड़े होते हैं और सिंक अडैप्टर से जुड़े सिस्टम के यूज़र इंटरफ़ेस के किसी हिस्से को कंट्रोल करते हैं, और सिंक से जुड़े अन्य फ़्लैग के बारे में बताता है. इस मेटाडेटा को इसमें संग्रहित विशेष XML फ़ाइल में घोषित करें आपके ऐप्लिकेशन प्रोजेक्ट की /res/xml/ डायरेक्ट्री में. फ़ाइल को कोई भी नाम दिया जा सकता है, हालांकि, इसे आम तौर पर syncadapter.xml कहा जाता है.

इस एक्सएमएल फ़ाइल में एक ऐसा एक्सएमएल एलिमेंट <sync-adapter> है जिसमें ये एट्रिब्यूट दिखते हैं:

android:contentAuthority
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कॉन्टेंट देने वाले के लिए यूआरआई सर्टिफ़िकेट. अगर आपने इसके लिए कोई स्टब कॉन्टेंट प्रोवाइडर बनाया है पिछले लेसन में स्टब कॉन्टेंट प्रोवाइडर बनाना में, उस वैल्यू का इस्तेमाल करें जो आपने विशेषता android:authorities ऐप्लिकेशन मेनिफ़ेस्ट में जोड़े गए <provider> एलिमेंट में. इस एट्रिब्यूट की वैल्यू इस सेक्शन में ज़्यादा जानकारी दी गई है मेनिफ़ेस्ट में प्रोवाइडर का एलान करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अगर आप अपने सिंक अडैप्टर से, कॉन्टेंट देने वाले किसी सर्वर पर डेटा ट्रांसफ़र कर रहे हैं, तो यह वैल्यू, उस डेटा के लिए इस्तेमाल किए जा रहे कॉन्टेंट यूआरआई अथॉरिटी से मेल खानी चाहिए. यह मान में से एक है, जिसे आपने android:authorities अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है <provider> एलिमेंट का एट्रिब्यूट है, जो आपके ऐप्लिकेशन मेनिफ़ेस्ट में प्रोवाइडर के बारे में बताता है.
android:accountType
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वह खाता टाइप जो सिंक अडैप्टर फ़्रेमवर्क के लिए ज़रूरी है. वैल्यू एक जैसी होनी चाहिए पुष्टि करने वाली मेटाडेटा फ़ाइल बनाते समय, आपने खाता टाइप की वैल्यू दी थी. जैसे, Google Authenticator की मेटाडेटा फ़ाइल जोड़ना सेक्शन में बताया गया है. यह वही मान है जिसे आपने सेक्शन के कोड स्निपेट में कॉन्स्टेंट ACCOUNT_TYPE फ़्रेमवर्क के मुताबिक ज़रूरी खाता जोड़ें.
सेटिंग के एट्रिब्यूट
android:userVisible
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इससे यह सेट किया जाता है कि सिंक अडैप्टर का खाता टाइप किसको दिखे. डिफ़ॉल्ट रूप से, खाता टाइप से जुड़ा खाता आइकॉन और लेबल खाते सेक्शन में जाकर, सिंक करने या सिंक करने के लिए अडैप्टर तब तक नहीं दिखता, जब तक कि आपके पास ऐसा खाता टाइप या डोमेन न हो जो आसानी से जुड़ा हो को कैसे ट्रैक करें. अगर आपके खाते का टाइप नहीं दिखता है, तो भी उपयोगकर्ताओं को ये काम करने की अनुमति दी जा सकती है आपके ऐप्लिकेशन की किसी गतिविधि में यूज़र इंटरफ़ेस की मदद से, सिंक अडैप्टर को कंट्रोल करने की सुविधा मिलती है.
android:supportsUploading
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इससे आपको क्लाउड पर डेटा अपलोड करने की सुविधा मिलती है. अगर सिर्फ़ आपका ऐप्लिकेशन है, तो इसे false पर सेट करें डेटा डाउनलोड करता है.
android:allowParallelSyncs
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इससे आपके सिंक अडैप्टर कॉम्पोनेंट के कई इंस्टेंस एक साथ चलाए जा सकते हैं. अगर आपका ऐप्लिकेशन एक से ज़्यादा उपयोगकर्ताओं के खातों के साथ काम करता है और आपको एक से ज़्यादा लोगों के खातों को अनुमति देनी है, तो इसका इस्तेमाल करें साथ ही साथ डेटा ट्रांसफ़र करने के लिए उपयोगकर्ताओं को इन तरीकों का इस्तेमाल करना होगा. अगर आप कभी नहीं जाते हैं, तो इस फ़्लैग का कोई प्रभाव नहीं होगा कई डेटा ट्रांसफ़र किए जा सकते हैं.
android:isAlwaysSyncable
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सिंक अडैप्टर फ़्रेमवर्क से पता चलता है कि यह आपके सिंक अडैप्टर को किसी भी समय चला सकता है आपके द्वारा तय किए गए समय के लिए है. अगर आपको प्रोग्राम के हिसाब से अपने सिंक के समय को कंट्रोल करना है, तो अडैप्टर काम कर सकता है. इस फ़्लैग को false पर सेट करें और फिर कॉल करें दौड़ लगाने के लिए requestSync() सिंक अडैप्टर. सिंक अडैप्टर चलाने के बारे में ज़्यादा जानने के लिए, यह लेसन देखें सिंक अडैप्टर चलाना

नीचे दिए गए उदाहरण में ऐसे सिंक अडैप्टर के लिए एक्सएमएल दिखाया गया है जो सिंगल प्लेसहोल्डर खाते का इस्तेमाल करता है और सिर्फ़ डाउनलोड करता है.

<?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 का एलान करना होता है जिन्हें आपने जोड़ा है.

सिंक अडैप्टर कॉम्पोनेंट, एक ऐसा कोड चलाता है जो नेटवर्क और तो आपको इंटरनेट ऐक्सेस करने के लिए अनुमति का अनुरोध करना होगा. इसके अलावा, आपके ऐप्लिकेशन को सिंक अडैप्टर सेटिंग पढ़ने और लिखने की अनुमति के लिए अनुरोध करें, ताकि आप सिंक को कंट्रोल कर सकें एडैप्टर की मदद से, उसे अपने ऐप्लिकेशन के अन्य कॉम्पोनेंट से प्रोग्रामेटिक तौर पर इस्तेमाल करता है. आपको किसी खास अनुमति, जो आपके ऐप्लिकेशन को आपके बनाए गए पुष्टि करने वाले कॉम्पोनेंट का इस्तेमाल करने देती है स्टब Authenticator बनाना लेसन में दी गई है.

इन अनुमतियों का अनुरोध करने के लिए, अपने ऐप्लिकेशन मेनिफ़ेस्ट में इन चीज़ों को इसके चाइल्ड एलिमेंट के तौर पर जोड़ें <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 का एलान करने के लिए, जिसका इस्तेमाल फ़्रेमवर्क अपने सिंक अडैप्टर से इंटरैक्ट करें, तो नीचे दिए गए एक्सएमएल को अपने ऐप्लिकेशन मेनिफ़ेस्ट में चाइल्ड एलिमेंट के तौर पर जोड़ें कुल <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> अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एलिमेंट एक ऐसा फ़िल्टर सेट अप करता है जो इंटेंट कार्रवाई से ट्रिगर होता है सिंक अडैप्टर चलाने के लिए सिस्टम की ओर से भेजा गया android.content.SyncAdapter. फ़िल्टर में ट्रिगर होता है, तो सिस्टम आपकी बनाई गई सीमित सेवा को शुरू करता है, जो इस उदाहरण में SyncService. एट्रिब्यूट android:exported="false" अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इससे सिर्फ़ आपके ऐप्लिकेशन और सिस्टम Service. एट्रिब्यूट android:process=":sync" अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सिस्टम को ग्लोबल शेयर की गई प्रोसेस में, Service को चलाने का निर्देश देती है sync. अगर आपके ऐप्लिकेशन में एक से ज़्यादा सिंक अडैप्टर हैं, तो वे इस प्रोसेस को शेयर कर सकते हैं, इससे ओवरहेड कम होता है.

कॉन्टेंट बनाने <meta-data> अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एलिमेंट, उस सिंक अडैप्टर मेटाडेटा की एक्सएमएल फ़ाइल का नाम देता है जिसे आपने पहले बनाया था. कॉन्टेंट बनाने android:name अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एट्रिब्यूट से पता चलता है कि यह मेटाडेटा सिंक अडैप्टर फ़्रेमवर्क के लिए है. कॉन्टेंट बनाने android:resource अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एलिमेंट, मेटाडेटा फ़ाइल का नाम बताता है.

अब आपके पास सिंक अडैप्टर के सभी कॉम्पोनेंट उपलब्ध हैं. अगले लेसन में, आपको सिंक अडैप्टर फ़्रेमवर्क को आपका सिंक अडैप्टर चलाने के लिए कहें. भले ही, वह किसी इवेंट के रिस्पॉन्स में या ऐसे ही चालू रहे एक सामान्य शेड्यूल बनाया.