ध्यान दें: हमारा सुझाव है कि आप WorkManager को का सुझाव दिया जाता है. कृपया बैकग्राउंड प्रोसेसिंग गाइड देखें और जानें कि आपके लिए कौनसा तरीका सबसे अच्छा है.
इस क्लास के पिछले लेसन में, आपने सीखा कि सिंक अडैप्टर कॉम्पोनेंट को कैसे बनाया जाता है इसमें डेटा ट्रांसफ़र कोड शामिल होता है. साथ ही, अतिरिक्त कॉम्पोनेंट को जोड़ने का तरीका भी बताया जाता है. सिस्टम में सिंक अडैप्टर प्लग करें. अब आपके पास वह सब कुछ है जो आपको ऐप्लिकेशन इंस्टॉल करने के लिए चाहिए में एक सिंक अडैप्टर होता है, लेकिन आपके द्वारा देखा गया कोई भी कोड वास्तव में सिंक एडॉप्टर नहीं चलाता है.
आपको अपने सिंक अडैप्टर को शेड्यूल के आधार पर या कुछ इवेंट. उदाहरण के लिए, हो सकता है कि आप अपने सिंक अडैप्टर को नियमित शेड्यूल पर चलाना चाहें, या किसी समयावधि में या दिन के किसी खास समय पर. आप चाहें, तो सिंक करने की सुविधा चालू करें जब डिवाइस में सेव किए गए डेटा में बदलाव होते हैं, तो अडैप्टर को चालू किया जाता है. आपको अपने उपयोगकर्ता की कार्रवाई से अडैप्टर को तुरंत सिंक करना होता है, क्योंकि ऐसा करने से आपको पूरा की शेड्यूलिंग करने की क्षमता का लाभ उठा सकते हैं. उदाहरण के लिए, आपको इस टूल की मदद से, आपके यूज़र इंटरफ़ेस में रीफ़्रेश बटन भी दिखता है.
सिंक अडैप्टर चलाने के लिए, आपके पास ये विकल्प हैं:
- जब सर्वर का डेटा बदलता है
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सर्वर से आने वाले मैसेज के जवाब में, सिंक अडैप्टर चलाएं. इससे यह पता चलेगा कि सर्वर पर काम करने वाला डेटा बदल गया है. यह विकल्प आपको सर्वर से डिवाइस पर डेटा रीफ़्रेश करने की सुविधा देता है इससे हमारी परफ़ॉर्मेंस में गिरावट नहीं आती. साथ ही, सर्वर की पोलिंग करके बैटरी लाइफ़ भी खराब होती है.
- डिवाइस के डेटा में बदलाव होने पर
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है डिवाइस पर डेटा बदलने पर सिंक अडैप्टर चलाएं. इस विकल्प की मदद से, आपको डेटा में बदलाव किया गया हो. खास तौर पर, यह तब काम आता है, जब आपको यह पक्का करना हो कि कि सर्वर में हमेशा डिवाइस का सबसे नया डेटा मौजूद रहता है. इस विकल्प को इस्तेमाल करना आसान है लागू करें. अगर आप स्टब का इस्तेमाल कर रहे हैं कॉन्टेंट उपलब्ध कराता है, तो डेटा में बदलावों का पता लगाना ज़्यादा मुश्किल हो सकता है.
- नियमित अंतराल पर
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अपने चुने हुए इंटरवल की समयसीमा खत्म होने के बाद, सिंक अडैप्टर चलाएं या उसे तय किए गए समय पर चलाएं समय.
- मांग पर
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है उपयोगकर्ता की कार्रवाई के जवाब में, सिंक अडैप्टर चलाएं. हालांकि, सर्वोत्तम उपयोगकर्ता अनुभव प्रदान करने के लिए अनुभव के लिए, मुख्य तौर पर ज़्यादा ऑटोमेटेड विकल्पों में से किसी एक पर भरोसा करना चाहिए. इस्तेमाल करके स्वचालित विकल्पों का उपयोग करके, आप बैटरी और नेटवर्क संसाधनों को बचाते हैं.
इस लेसन के बाकी हिस्से में, हर विकल्प के बारे में ज़्यादा जानकारी दी गई है.
सर्वर का डेटा बदलने पर, सिंक अडैप्टर चलाएं
अगर आपका ऐप्लिकेशन, सर्वर से डेटा ट्रांसफ़र करता है और सर्वर का डेटा बार-बार बदलता रहता है, तो
डेटा में होने वाले बदलावों की वजह से डाउनलोड करने के लिए सिंक अडैप्टर. सिंक अडैप्टर चलाने के लिए,
सर्वर आपके ऐप्लिकेशन में मौजूद BroadcastReceiver
पर एक खास मैसेज भेजता है.
इस मैसेज के जवाब में, ContentResolver.requestSync()
को कॉल करें, ताकि सिंक अडैप्टर फ़्रेमवर्क को
सिंक अडैप्टर.
Google क्लाउड से मैसेज (GCM) दोनों
इस मैसेजिंग सिस्टम को चलाने के लिए, सर्वर और डिवाइस कॉम्पोनेंट की ज़रूरत पड़ेगी. ट्रिगर करने के लिए GCM का इस्तेमाल करना
ट्रांसफ़र की प्रक्रिया, स्थिति की जांच करने वाले पोलिंग सर्वर के मुकाबले ज़्यादा भरोसेमंद और असरदार होती है. मतदान करते समय
ऐसे Service
की ज़रूरत होती है जो हमेशा चालू रहता है. GCM किसी
मैसेज आने पर BroadcastReceiver
चालू हो जाता है. मतदान करते समय
कोई अपडेट उपलब्ध न होने पर भी नियमित अंतराल पर बैटरी पावर का उपयोग करता है, GCM केवल
देख सकते हैं.
ध्यान दें: अगर GCM का इस्तेमाल करके ब्रॉडकास्ट के ज़रिए सिंक अडैप्टर को सभी डिवाइसों पर ट्रिगर किया जाता है याद रखें कि जिन डिवाइसों पर आपका ऐप्लिकेशन इंस्टॉल है, उन्हें आपका मैसेज इसी पर मिलता है करीब-करीब एक ही समय पर. इस स्थिति में, आपके सिंक अडैप्टर के कई इंस्टेंस चल सकते हैं साथ ही, जिसकी वजह से सर्वर और नेटवर्क पर ज़्यादा लोड पड़ रहा है. ब्रॉडकास्ट पर इस तरह की समस्या से बचने के लिए सभी डिवाइसों के लिए, इसलिए आपको सिंक अडैप्टर की प्रोसेस को कुछ समय तक टालना चाहिए हर डिवाइस के लिए अलग-अलग होता है.
नीचे दिया गया कोड स्निपेट आपको
requestSync()
इनकमिंग GCM संदेश:
Kotlin
... // Constants // Content provider authority const val AUTHORITY = "com.example.android.datasync.provider" // Account type const val ACCOUNT_TYPE = "com.example.android.datasync" // Account const val ACCOUNT = "default_account" // Incoming Intent key for extended data const val KEY_SYNC_REQUEST = "com.example.android.datasync.KEY_SYNC_REQUEST" ... class GcmBroadcastReceiver : BroadcastReceiver() { ... override fun onReceive(context: Context, intent: Intent) { // Get a GCM object instance val gcm: GoogleCloudMessaging = GoogleCloudMessaging.getInstance(context) // Get the type of GCM message val messageType: String? = gcm.getMessageType(intent) /* * Test the message type and examine the message contents. * Since GCM is a general-purpose messaging system, you * may receive normal messages that don't require a sync * adapter run. * The following code tests for a a boolean flag indicating * that the message is requesting a transfer from the device. */ if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE == messageType && intent.getBooleanExtra(KEY_SYNC_REQUEST, false)) { /* * Signal the framework to run your sync adapter. Assume that * app initialization has already created the account. */ ContentResolver.requestSync(mAccount, AUTHORITY, null) ... } ... } ... }
Java
public class GcmBroadcastReceiver extends BroadcastReceiver { ... // Constants // Content provider authority public static final String AUTHORITY = "com.example.android.datasync.provider"; // Account type public static final String ACCOUNT_TYPE = "com.example.android.datasync"; // Account public static final String ACCOUNT = "default_account"; // Incoming Intent key for extended data public static final String KEY_SYNC_REQUEST = "com.example.android.datasync.KEY_SYNC_REQUEST"; ... @Override public void onReceive(Context context, Intent intent) { // Get a GCM object instance GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); // Get the type of GCM message String messageType = gcm.getMessageType(intent); /* * Test the message type and examine the message contents. * Since GCM is a general-purpose messaging system, you * may receive normal messages that don't require a sync * adapter run. * The following code tests for a a boolean flag indicating * that the message is requesting a transfer from the device. */ if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType) && intent.getBooleanExtra(KEY_SYNC_REQUEST)) { /* * Signal the framework to run your sync adapter. Assume that * app initialization has already created the account. */ ContentResolver.requestSync(mAccount, AUTHORITY, null); ... } ... } ... }
कॉन्टेंट देने वाले का डेटा बदलने पर, सिंक अडैप्टर चलाएं
अगर आपका ऐप्लिकेशन, कॉन्टेंट देने वाले किसी प्लैटफ़ॉर्म पर डेटा इकट्ठा करता है और आपको जब चाहें, तब सर्वर को अपडेट करना चाहिए
तो आप अपने ऐप्लिकेशन को इस तरह सेट अप कर सकते हैं कि वह आपके सिंक अडैप्टर को अपने-आप चलने दे. ऐसा करें
तो आप कॉन्टेंट देने वाले के लिए एक ऑब्ज़र्वर रजिस्टर करते हैं. जब आपके कॉन्टेंट देने वाले में डेटा
बदलावों के साथ कॉन्टेंट उपलब्ध कराने वाला फ़्रेमवर्क, ऑब्ज़र्वर को कॉल करता है. ऑब्ज़र्वर में जाकर,
फ़्रेमवर्क को चलाने के लिए निर्देश देने के लिए requestSync()
आपका सिंक अडैप्टर.
ध्यान दें: अगर आप किसी स्टब कॉन्टेंट देने वाले का इस्तेमाल कर रहे हैं, तो
कॉन्टेंट देने वाला और onChange()
है
कभी कॉल नहीं किया. इस मामले में, आपको बदलावों का पता लगाने के लिए अपना खुद का तरीका उपलब्ध कराना होगा
डिवाइस डेटा. कॉल करने के लिए भी इस तरीके का इस्तेमाल किया जाता है
डेटा बदलने पर requestSync()
.
अपने कॉन्टेंट देने वाले के लिए ऑब्ज़र्वर बनाने के लिए, क्लास को बढ़ाएं
ContentObserver
और इसके दोनों रूपों को
onChange()
तरीका. तय सीमा में
onChange()
, कॉल करें
सिंक अडैप्टर चालू करने के लिए requestSync()
.
ऑब्ज़र्वर को रजिस्टर करने के लिए,
registerContentObserver()
. तय सीमा में
इस कॉल के लिए, आपको जो डेटा देखना है उसके लिए आपको कॉन्टेंट यूआरआई भी भेजना होगा. कॉन्टेंट
प्रोवाइडर फ़्रेमवर्क इस वॉच यूआरआई की तुलना उन कॉन्टेंट यूआरआई से करता है जिन्हें आर्ग्युमेंट के तौर पर पास किया जाता है
सेवा देने वाली कंपनी में बदलाव करने के ContentResolver
तरीके, जैसे
ContentResolver.insert()
. अगर कोई मिलता है, तो
ContentObserver.onChange()
को लागू करना
को कॉल किया जाता है.
नीचे दिया गया कोड स्निपेट आपको ContentObserver
के बारे में बताने का तरीका बताता है
टेबल होने पर, requestSync()
को कॉल करता है
बदलाव:
Kotlin
// Constants // Content provider scheme const val SCHEME = "content://" // Content provider authority const val AUTHORITY = "com.example.android.datasync.provider" // Path for the content provider table const val TABLE_PATH = "data_table" ... class MainActivity : FragmentActivity() { ... // A content URI for the content provider's data table private lateinit var uri: Uri // A content resolver for accessing the provider private lateinit var mResolver: ContentResolver ... inner class TableObserver(...) : ContentObserver(...) { /* * Define a method that's called when data in the * observed content provider changes. * This method signature is provided for compatibility with * older platforms. */ override fun onChange(selfChange: Boolean) { /* * Invoke the method signature available as of * Android platform version 4.1, with a null URI. */ onChange(selfChange, null) } /* * Define a method that's called when data in the * observed content provider changes. */ override fun onChange(selfChange: Boolean, changeUri: Uri?) { /* * Ask the framework to run your sync adapter. * To maintain backward compatibility, assume that * changeUri is null. */ ContentResolver.requestSync(account, AUTHORITY, null) } ... } ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ... // Get the content resolver object for your app mResolver = contentResolver // Construct a URI that points to the content provider data table uri = Uri.Builder() .scheme(SCHEME) .authority(AUTHORITY) .path(TABLE_PATH) .build() /* * Create a content observer object. * Its code does not mutate the provider, so set * selfChange to "false" */ val observer = TableObserver(false) /* * Register the observer for the data table. The table's path * and any of its subpaths trigger the observer. */ mResolver.registerContentObserver(uri, true, observer) ... } ... }
Java
public class MainActivity extends FragmentActivity { ... // Constants // Content provider scheme public static final String SCHEME = "content://"; // Content provider authority public static final String AUTHORITY = "com.example.android.datasync.provider"; // Path for the content provider table public static final String TABLE_PATH = "data_table"; // Account public static final String ACCOUNT = "default_account"; // Global variables // A content URI for the content provider's data table Uri uri; // A content resolver for accessing the provider ContentResolver mResolver; ... public class TableObserver extends ContentObserver { /* * Define a method that's called when data in the * observed content provider changes. * This method signature is provided for compatibility with * older platforms. */ @Override public void onChange(boolean selfChange) { /* * Invoke the method signature available as of * Android platform version 4.1, with a null URI. */ onChange(selfChange, null); } /* * Define a method that's called when data in the * observed content provider changes. */ @Override public void onChange(boolean selfChange, Uri changeUri) { /* * Ask the framework to run your sync adapter. * To maintain backward compatibility, assume that * changeUri is null. */ ContentResolver.requestSync(mAccount, AUTHORITY, null); } ... } ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... // Get the content resolver object for your app mResolver = getContentResolver(); // Construct a URI that points to the content provider data table uri = new Uri.Builder() .scheme(SCHEME) .authority(AUTHORITY) .path(TABLE_PATH) .build(); /* * Create a content observer object. * Its code does not mutate the provider, so set * selfChange to "false" */ TableObserver observer = new TableObserver(false); /* * Register the observer for the data table. The table's path * and any of its subpaths trigger the observer. */ mResolver.registerContentObserver(uri, true, observer); ... } ... }
समय-समय पर सिंक अडैप्टर चलाएं
आपके पास समय-समय पर, सिंक अडैप्टर को चलाने का विकल्प होता है. इसके लिए, आपको चलने के बीच इंतज़ार का समय सेट करना होगा, उसे दिन के किसी खास समय पर या दोनों समय पर चलाकर देखा जा सकता है. सिंक अडैप्टर चल रहा है समय-समय पर आपको अपने सर्वर के अपडेट इंटरवल का मोटे तौर पर मिलान करने की अनुमति देता है.
इसी तरह, अगर आपका सर्वर कुछ समय से इस्तेमाल में नहीं है, तो डिवाइस से डेटा अपलोड किया जा सकता है. आपके सिंक अडैप्टर को रात में चलने के लिए शेड्यूल कर रहा है. ज़्यादातर उपयोगकर्ता अपने डिवाइस को चालू और प्लग-इन करके रखते हैं रात में, इसलिए यह समय आम तौर पर उपलब्ध रहता है. इसके अलावा, डिवाइस पर कोई अन्य टास्क नहीं चल रहा है और इसे सिंक अडैप्टर में भी इस्तेमाल किया जा सकता है. अगर यह तरीका अपनाया जाता है, तो आपको हर डिवाइस अलग-अलग समय पर डेटा ट्रांसफ़र ट्रिगर करता है. अगर सभी डिवाइस सिंक करने वाला डेटा एक ही समय पर सिंक करते हैं, तो हो सकता है कि सर्वर और सेल प्रोवाइडर का डेटा ओवरलोड हो जाए नेटवर्क.
आम तौर पर, अगर आपके उपयोगकर्ताओं को इंस्टैंट अपडेट की ज़रूरत नहीं है, लेकिन समय-समय पर अपडेट की प्रोसेस जारी रहती है, तो नियमित अपडेट होते हैं. अगर आपको समय-समय पर दौड़ना है, तो अप-टू-डेट डेटा, जो छोटे सिंक अडैप्टर की क्षमता के साथ काम करता है. साथ ही, यह डिवाइस का बहुत ज़्यादा इस्तेमाल नहीं करता संसाधन.
अपना सिंक अडैप्टर नियमित अंतराल पर चलाने के लिए, कॉल करें
addPeriodicSync()
. यह आपके
सिंक अडैप्टर को एक खास समय तक चलने के लिए सेट कर सकता है. सिंक अडैप्टर फ़्रेमवर्क
अन्य सिंक अडैप्टर को एक्ज़ीक्यूट करने पर ध्यान देना चाहिए. साथ ही, बैटरी की परफ़ॉर्मेंस को बेहतर बनाने की कोशिश की जाती है.
बीत चुका समय कुछ सेकंड तक अलग-अलग हो सकता है. साथ ही, फ़्रेमवर्क आपका सिंक अडैप्टर नहीं चलाएगा, अगर
नेटवर्क उपलब्ध नहीं है.
ध्यान दें कि addPeriodicSync()
यह नहीं करता
सिंक अडैप्टर को दिन के किसी खास समय पर चलाएं. सिंक अडैप्टर को मोटे तौर पर
हर दिन एक ही समय पर, दोहराने वाले अलार्म का उपयोग ट्रिगर के रूप में करें. बार-बार होने वाले अलार्म के बारे में ज़्यादा जानकारी दी गई है
AlarmManager
के लिए, रेफ़रंस दस्तावेज़ में दी गई जानकारी. अगर आपको
सेट करने के लिए setInexactRepeating()
तरीका
दिन के समय वाले ऐसे ट्रिगर जिनमें कुछ बदलाव होते हैं, तब भी आपको शुरू होने का समय
यह पक्का करें कि अलग-अलग डिवाइसों पर चलने वाला सिंक अडैप्टर स्टेज किया गया है.
addPeriodicSync()
तरीका काम नहीं करता
setSyncAutomatically()
बंद करें,
इसलिए हो सकता है कि आपको बहुत कम समय में कई सिंक प्रोसेस मिल जाएं. साथ ही, सिर्फ़ कुछ ही
इस कॉल में सिंक अडैप्टर कंट्रोल फ़्लैग की अनुमति है
addPeriodicSync()
; इन फ़्लैग को
अनुमति नहीं है, के बारे में दिए गए दस्तावेज़ में बताया गया है
addPeriodicSync()
.
यहां दिए गए कोड स्निपेट में, समय-समय पर सिंक होने वाले अडैप्टर के चलने को शेड्यूल करने का तरीका बताया गया है:
Kotlin
// Content provider authority const val AUTHORITY = "com.example.android.datasync.provider" // Account const val ACCOUNT = "default_account" // Sync interval constants const val SECONDS_PER_MINUTE = 60L const val SYNC_INTERVAL_IN_MINUTES = 60L const val SYNC_INTERVAL = SYNC_INTERVAL_IN_MINUTES * SECONDS_PER_MINUTE ... class MainActivity : FragmentActivity() { ... // A content resolver for accessing the provider private lateinit var mResolver: ContentResolver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ... // Get the content resolver for your app mResolver = contentResolver /* * Turn on periodic syncing */ ContentResolver.addPeriodicSync( mAccount, AUTHORITY, Bundle.EMPTY, SYNC_INTERVAL) ... } ... }
Java
public class MainActivity extends FragmentActivity { ... // Constants // Content provider authority public static final String AUTHORITY = "com.example.android.datasync.provider"; // Account public static final String ACCOUNT = "default_account"; // Sync interval constants public static final long SECONDS_PER_MINUTE = 60L; public static final long SYNC_INTERVAL_IN_MINUTES = 60L; public static final long SYNC_INTERVAL = SYNC_INTERVAL_IN_MINUTES * SECONDS_PER_MINUTE; // Global variables // A content resolver for accessing the provider ContentResolver mResolver; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... // Get the content resolver for your app mResolver = getContentResolver(); /* * Turn on periodic syncing */ ContentResolver.addPeriodicSync( mAccount, AUTHORITY, Bundle.EMPTY, SYNC_INTERVAL); ... } ... }
मांग पर सिंक अडैप्टर चलाएं
किसी उपयोगकर्ता के अनुरोध के जवाब में, सिंक अडैप्टर को चलाना सबसे कम पसंदीदा तरीका है का उपयोग करें. फ़्रेमवर्क को खास तौर पर, बैटरी पावर बचाने के लिए डिज़ाइन किया गया है जब यह शेड्यूल के हिसाब से सिंक अडैप्टर को चलाता है. डेटा के जवाब में सिंक करने वाले विकल्प बदलाव, बैटरी पावर का बेहतर ढंग से इस्तेमाल करते हैं, क्योंकि पावर का इस्तेमाल नया डेटा देने के लिए किया जाता है.
इसके मुकाबले, उपयोगकर्ताओं को मांग पर सिंक करने की सुविधा देने का मतलब है कि सिंक अपने-आप चलता है. इससे नेटवर्क और पावर के संसाधनों का गलत इस्तेमाल होता है. साथ ही, मांग पर सिंक करने की सुविधा देने से, उपयोगकर्ता को सिंक करने का अनुरोध करें, भले ही इस बात का कोई सबूत न हो कि डेटा में बदलाव हुआ है. साथ ही, हम सिंक होने की प्रोसेस के दौरान डेटा रीफ़्रेश नहीं करता है, तो बैटरी पावर का बेअसर इस्तेमाल होता है. आम तौर पर, आपके ऐप्लिकेशन को इनमें से कोई एक काम करना चाहिए उपयोगकर्ता के इनपुट के बिना, सिंक को ट्रिगर करने या उन्हें नियमित अंतराल पर शेड्यूल करने के लिए, अन्य सिग्नल का इस्तेमाल करें.
हालांकि, अगर आप अब भी मांग पर सिंक अडैप्टर चलाना चाहते हैं, तो
मैन्युअल सिंक अडैप्टर चलाएं, फिर कॉल करें
ContentResolver.requestSync()
.
इन फ़्लैग के साथ मांग पर ट्रांसफ़र चलाएं:
-
SYNC_EXTRAS_MANUAL
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
मैन्युअल तरीके से सिंक करना ज़रूरी है. सिंक अडैप्टर फ़्रेमवर्क मौजूदा सेटिंग को अनदेखा करता है,
जैसे कि
setSyncAutomatically()
का सेट किया गया फ़्लैग. -
SYNC_EXTRAS_EXPEDITED
- अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इससे सिंक तुरंत शुरू हो जाता है. अगर आप इसे सेट नहीं करते हैं, तो सिस्टम कई सिंक करने का अनुरोध करने से कुछ सेकंड पहले, क्योंकि यह बैटरी के इस्तेमाल को ऑप्टिमाइज़ करने की कोशिश करता है: बहुत कम समय में कई अनुरोधों को शेड्यूल करना.
नीचे दिया गया कोड स्निपेट आपको कॉल करने का तरीका बताता है
बटन के जवाब में requestSync()
क्लिक:
Kotlin
// Constants // Content provider authority val AUTHORITY = "com.example.android.datasync.provider" // Account type val ACCOUNT_TYPE = "com.example.android.datasync" // Account val ACCOUNT = "default_account" ... class MainActivity : FragmentActivity() { ... // Instance fields private lateinit var mAccount: Account ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ... /* * Create the placeholder account. The code for CreateSyncAccount * is listed in the lesson Creating a Sync Adapter */ mAccount = createSyncAccount() ... } /** * Respond to a button click by calling requestSync(). This is an * asynchronous operation. * * This method is attached to the refresh button in the layout * XML file * * @param v The View associated with the method call, * in this case a Button */ fun onRefreshButtonClick(v: View) { // Pass the settings flags by inserting them in a bundle val settingsBundle = Bundle().apply { putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true) putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true) } /* * Request the sync for the default account, authority, and * manual sync settings */ ContentResolver.requestSync(mAccount, AUTHORITY, settingsBundle) }
Java
public class MainActivity extends FragmentActivity { ... // Constants // Content provider authority public static final String AUTHORITY = "com.example.android.datasync.provider"; // Account type public static final String ACCOUNT_TYPE = "com.example.android.datasync"; // Account public static final String ACCOUNT = "default_account"; // Instance fields Account mAccount; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... /* * Create the placeholder account. The code for CreateSyncAccount * is listed in the lesson Creating a Sync Adapter */ mAccount = CreateSyncAccount(this); ... } /** * Respond to a button click by calling requestSync(). This is an * asynchronous operation. * * This method is attached to the refresh button in the layout * XML file * * @param v The View associated with the method call, * in this case a Button */ public void onRefreshButtonClick(View v) { // Pass the settings flags by inserting them in a bundle Bundle settingsBundle = new Bundle(); settingsBundle.putBoolean( ContentResolver.SYNC_EXTRAS_MANUAL, true); settingsBundle.putBoolean( ContentResolver.SYNC_EXTRAS_EXPEDITED, true); /* * Request the sync for the default account, authority, and * manual sync settings */ ContentResolver.requestSync(mAccount, AUTHORITY, settingsBundle); }