
कई एंड्रॉइड एप्लिकेशन विकसित करते समय, आपको सर्वर पर डेटा के साथ डेटा को सिंक्रनाइज़ करने की प्रक्रिया को व्यवस्थित करने की आवश्यकता होती है। दो मुख्य तरीके हैं कि इस सिंक्रनाइज़ेशन को कैसे लागू किया जा सकता है।
पहला तरीका है
अलार्म मैनजर और
सर्विस का उपयोग करते हुए क्लासिक वन (सबसे लोकप्रिय और सबसे आसान)। उदाहरण के लिए, जैसा कि इस
लेख में वर्णित है।
दूसरी विधि "सही" एक है (लेकिन अभी तक, जाहिरा तौर पर शायद ही कभी किसी के द्वारा उपयोग किया जाता है) -
SyncAdapter का उपयोग करना।
अपने आवेदन को विकसित करते समय, शुरू में मैंने "सही" एक (यानी दूसरा तरीका) को लागू करने की कोशिश की।
इसे कैसे लागू किया जाए यह थोड़ा कम है। सबसे पहले, मैं आपको उन कठिनाइयों और सुविधाओं के बारे में बताता हूँ, जिन्हें इसके कार्यान्वयन के दौरान मुझे सामना करना पड़ा।
SyncAdapter का उपयोग करके सिंक्रनाइज़ेशन के कार्यान्वयन की विशेषताएं
सबसे पहले, यह विधि प्रलेखन में खराब वर्णित है। हालांकि एंड्रॉइड डेवलपर्स साइट पर
एक कार्यान्वयन उदाहरण है , इस
लिंक पर
एक लेख एक बेहतर उदाहरण (स्पष्टीकरण के साथ) होगा।
काम करने के लिए इस सिंक्रनाइज़ेशन विधि के लिए, विशेष रूप से आपके प्रस्ताव के लिए एक अलग प्रकार का खाता बनाना आवश्यक है (यदि मौजूदा खाते, उदाहरण के लिए, Google खाते उपयुक्त नहीं हैं), और यह एक अलग लेख (उदाहरण के लिए,
यहां देखें) के लिए एक विषय है।
यह खाता
सेटिंग्स /
खाते और सिंक अनुभाग में उपलब्ध होगा। खाता बनाना (हटाना) न केवल आपके आवेदन से, बल्कि इस खंड से भी संभव होगा। इसमें, आप अपने आवेदन के लिए कई खाते बना सकते हैं (क्या यह आपके आवेदन के लिए आवश्यक है?)। प्रत्येक खाते के लिए आपको एक नाम की आवश्यकता होती है (OAuth खातों के लिए आपको काल्पनिक नामों का उपयोग करना होगा)।
उसी समय, गलत तरीके से लिखा खाता कोड डिवाइस और एमुलेटर दोनों को पुनरारंभ करता है - यह परीक्षण करना मुश्किल है। उसी समय, यदि आपने केवल खाते के लिए ज़िम्मेदार कोड बनाया है और उसका परीक्षण करना चाहते हैं, तो यह काम नहीं करता है - पूरी तरह से लिखे गए
SyncAdapter कोड के बिना, जब आप
खाते और सिंक दर्ज करेंगे तो डिवाइस रिबूट हो जाएगा
।यदि आपकी सिंक्रोनाइज़ेशन प्रक्रिया को खाते की आवश्यकता नहीं है तो क्या होगा? आपको एक डमी खाता बनाना होगा।
यदि आपका एप्लिकेशन मौजूदा डेटाबेस - फ़ोन संपर्क, कैलेंडर ईवेंट, या उदाहरण के लिए, फ़ोटो के साथ डेटा को सिंक्रनाइज़ करेगा, तो सब कुछ सरल है (और नेटवर्क पर अधिकांश उदाहरण इस प्रकार के सिंक्रनाइज़ेशन के बारे में हैं)। यदि आपके डेटा के साथ सिंक्रनाइज़ेशन किया जाना है, तो यह आवश्यक है कि आपका
ContentProvider बनाया जाए।
यदि आपका आवेदन अन्य अनुप्रयोगों के साथ अपना आधार साझा नहीं करना चाहता है तो क्या होगा? आपको एक डमी बनाना होगा-
ContentProvider , उदाहरण के लिए,
एक ।
यदि सब कुछ किया जाता है, और यहां तक कि आपके स्वयं के सिंक
एडेप्टर (नीचे देखें) लिखा
जाता है, तो अब स्थानीय डेटाबेस में डेटा बदल जाने पर सिंक्रनाइज़ेशन स्वचालित रूप से शुरू हो जाएगा।
यदि सिंक्रनाइज़ेशन को मैन्युअल रूप से शुरू करने की आवश्यकता है, तो इसके लिए एक
अनुरोध सिंक
() फ़ंक्शन है, नीचे हम फ़ंक्शन की सीमाओं के
बारे में
लिखेंगे । यदि आपको स्वचालित रूप से सिंक्रनाइज़ेशन शुरू करने की आवश्यकता है, तो इसके लिए एक और फ़ंक्शन है -
addPeriodicSync () । हालांकि यह केवल एंड्रॉइड 2.2 या उच्चतर पर काम करता है। लेकिन यह फ़ंक्शन ठीक काम करता है - उदाहरण के लिए, यदि सिंक्रोनाइज़ेशन के समय कोई इंटरनेट कनेक्शन नहीं है, तो सिंक्रोनाइज़ेशन स्वचालित रूप से उसी क्षण होगा जब यह दिखाई देगा।
SyncAdapter का उपयोग करके सिंक्रोनाइज़ेशन को कैसे लागू करें 'a
SyncAdapter का उपयोग करके सिंक्रनाइज़ेशन को लागू करने के लिए क्या करने की आवश्यकता है? (StackOverflow से अनुवाद
प्रतिक्रिया )
1. एंड्रॉइड को सूचित करें कि एप्लिकेशन सिंक्रनाइज़ेशन का समर्थन करता है
ऐसा करने के लिए, AndroidManifest.xml में सिंक्रनाइज़ेशन सेवा निर्दिष्ट करें:
<service android:name=".sync.mySyncService" android:exported="true"> <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/sync_myapp" /> </service>
जहां
नाम सिंक्रनाइज़ेशन के लिए वर्ग के नाम के अनुरूप नाम है (बाद में इसके बारे में अधिक);
निर्यात किया गया - सेवा को अन्य घटकों (
ContentResolver सहित, जो सिंक्रनाइज़ेशन सेवा के साथ बातचीत करने के लिए उपयोग किया जाता है) को उपलब्ध कराता है;
अभिप्रेरण-फ़िल्टर आपको एक ऐसी घटना को रोकने की अनुमति देता है जिसमें सिंक्रनाइज़ेशन की आवश्यकता होती है (उदाहरण के लिए, जब आपके
ContentResolver 'a) के
RequestSync () फ़ंक्शन द्वारा सिंक्रनाइज़ेशन का अनुरोध किया जाता है।
2. SyncAdapter खोजने के लिए एक सेवा (सेवा) बनाएं 'a
उदाहरण के लिए:
public class mySyncService extends Service { private static mySyncAdapter mSyncAdapter = null; public SyncService() { super(); } @Override public void onCreate() { super.onCreate(); if (mSyncAdapter == null) { mSyncAdapter = new mySyncAdapter(getApplicationContext(), true); } } @Override public IBinder onBind(Intent arg0) { return mSyncAdapter.getSyncAdapterBinder(); } }
आपकी कक्षा को
सेवा का विस्तार करना चाहिए, इसमें एक
AbstractThreadedSyncAdapter उदाहरण चर होना चाहिए। इसे
सार्वजनिक IBinder onBind (इरादे) को लागू करना चाहिए और
SyncAdapterBinder को वापस करना चाहिए।
काफी कुछ इस वर्ग में लागू किया जाना चाहिए, क्योंकि यह सेवा
Android SyncAdapter के लिए एक मानक इंटरफ़ेस प्रदान करती है।
3. प्रत्यक्ष तुल्यकालन के लिए एक सिंक एडेप्टर वर्ग बनाएं
mySyncAdapter - वह स्थान जहाँ सिंक्रनाइज़ेशन तर्क स्वयं समाहित है। जब सिंक्रोनाइज़ेशन का समय आता है,
onPerformSync () कहा जाता है।
4. खाता प्रकार और सामग्री प्राधिकरण के बीच बाँध
पैराग्राफ 1 में,
AndroidManifest.xml फ़ाइल में,
नाम फ़ील्ड में, हमने मान निर्दिष्ट किया है, जो
ContentAuthority और खाते के बीच संबंध बनाता है।
AndroidManifest.xml एक और xml फ़ाइल को संदर्भित करता है। हमारे उदाहरण में, यह
Sync_myapp.xml है :
<?xml version="1.0" encoding="utf-8" ?> <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="com.android.contacts" android:accountType="com.google" android:userVisible="true" />
यह फ़ाइल Android को बताती है कि हमारे द्वारा
बनाया गया
SyncAdapter संपर्कों को सिंक्रनाइज़ करेगा।
ContentAuthority के सभी स्ट्रिंग मानों को उन मूल्यों से मेल खाना चाहिए जो सिंक्रनाइज़ेशन के साथ होंगे। यदि सिंक्रनाइज़ेशन आपके स्वयं के डेटाबेस के साथ होगा, तो आपके मूल्य के साथ। यदि किसी भी मौजूदा डेटाबेस (उदाहरण के लिए, संपर्कों या कैलेंडर घटनाओं के साथ), तो मानक मूल्यों के साथ। उदाहरण के लिए, ऊपर
"com.android.contacts" मान मानक संपर्कों की पहचान करता है।
खाता प्रकार का मान आपके मान या मानक मान से भी मेल
खाना चाहिए। यदि आप अपना स्वयं का खाता बनाते हैं, तो आपको अपने सर्वर पर अधिकृत करने के लिए
AccountAuthenticator का एक उपवर्ग बनाने की आवश्यकता होगी (ऊपर पहले से उल्लेखित
लेख देखें)। हमारे उदाहरण में निर्दिष्ट
"com.google" यह पहचानता है कि हम Google खाते का उपयोग कर रहे हैं।
5. निर्मित खाते के लिए सिंक्रनाइज़ेशन को सक्षम करना - ContentAuthority pair
अंत में, आप सिंक्रनाइज़ेशन प्रक्रिया को सक्षम कर सकते हैं। यह या तो
सेटिंग्स /
अकाउंट्स और सिंक सेक्शन में किया जा सकता है, या आपके एप्लिकेशन में प्रोग्रामेटिक रूप से किया जा सकता है:
ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
सिंक्रोनाइज़ेशन के लिए, इसे न केवल आपके एप्लिकेशन के लिए अनुमति दी जानी चाहिए - आपको सिंक्रोनाइज़ेशन के लिए वैश्विक अनुमति की आवश्यकता होती है (
सेटिंग्स /
खाते और सिंक अनुभाग में, संबंधित चेकबॉक्स को चेक करना होगा)।
यदि इनमें से कोई एक शर्त पूरी नहीं होती है, तो कॉल करने पर
RequestSync () तुरंत कुछ भी नहीं होगा, अनुरोधित सिंक्रनाइज़ेशन को बाद में किया जाएगा - जैसे ही सिंक्रनाइज़ेशन चालू होता है। हालांकि, इसके चारों ओर एक
रास्ता है।
इसके अतिरिक्त, आप समय-समय पर स्वचालित सिंक्रनाइज़ेशन को सक्षम कर सकते हैं।
निष्कर्ष
और इसलिए,
ASyncTask की तुलना में
SyncAdapter के साथ अच्छा (+) और बुरा (-) सिंक्रनाइज़ेशन
क्या है ?
(+) मानकों का पालन (आपका आवेदन सभी सिंक्रनाइज़ किए गए अनुप्रयोगों की सूची में है)
(+) कई खातों के लिए समर्थन
(+) स्वचालित तुल्यकालन के कार्यान्वयन में आसानी (जब सब कुछ पहले से लिखा हो)
इंटरनेट कनेक्शन होने पर (+) स्वचालित सिंक्रनाइज़ेशन
मानक डेटाबेस (संपर्क, कैलेंडर, आदि) के साथ सिंक्रनाइज़ेशन में (+) सुविधा
(-) खाता बनाने की आवश्यकता
(-) पूर्ण प्रलेखन की कमी
(-) कार्यान्वयन और परीक्षण की जटिलता
(-) स्वचालित आवधिक तुल्यकालन के लिए Android 2.2 और उच्चतर की आवश्यकता है
(-) अपने ContentProvider'a बनाने की जरूरत है
कुल मिलाकर, मैंने अपने
एप्लिकेशन में सिंक्रोनाइज़ेशन के लिए
ASyncTask को चुना (हालाँकि सिंक
एडेप्टर के लिए कोड पहले से ही लगभग पूरी तरह से लिखा हुआ था) - सबसे पहले, मैं एंड्रॉइड के संस्करण 2.2 तक सीमित नहीं होना चाहता था।