दिलचस्प पोस्ट
फ़ंक्शन पॉइंटर को अन्य प्रकार से कास्ट करना सब-वैल के द्वारा PHP बहुआयामी सरणी को क्रमबद्ध करें ">" (साइन-इन से अधिक) सीएसएस चयनकर्ता का मतलब क्या है? नेंट या एमएसबीइल्ड, जो एक को चुनने के लिए और कब? गिट कमिट संदेशः 50/72 प्रारूपण जावास्क्रिप्ट का उपयोग करके एंड्रॉइड वर्चुअल कीबोर्ड पर टाइप की गई कुंजी कैप्चर करें योग के साथ एक सारांश पंक्ति जोड़ें SwingUtilities.invokeLater क्या यह जांचने का कोई तरीका है कि कोई फ़ाइल उपयोग में है? मल्टी टेंगमेंट गतिविधि में कैसे चुने गए हैं? Google डिस्क एंड्रॉइड एपीआई का उपयोग करते हुए Google ड्राइव पर एक फ़ाइल कैसे हटाई जाए कैसे wkhtmltopdf के लिए तालिका पंक्ति के अंदर पेज ब्रेक से बचने के लिए क्या एक धागा को अनिश्चित रूप से रोकना है? क्या है ?: PHP 5.3 में? jquery कक्षा के साथ निकटतम पिछले भाई मिल

क्यों ContentResolver.requestSync एक समन्वयन को ट्रिगर नहीं करता?

मैं Google IO – स्लाइड 26 पर चर्चा की गई सामग्री-प्रदाता-सिंक एडेप्टर पैटर्न को लागू करने की कोशिश कर रहा हूं। मेरी सामग्री प्रदाता काम कर रहा है, और जब मैं देव उपकरण सिंक परीक्षक एप्लिकेशन से इसे ट्रिगर करता हूं, तब भी जब मैं कंटेंटरॉल्वर को कॉल करता हूं। मेरे ContentProvider से requestSync (खाता, प्राधिकरण, बंडल), मेरी सिंक कभी भी ट्रिगर नहीं हुई है

ContentResolver.requestSync( account, AUTHORITY, new Bundle()); 

संपादित करें – मैनिफ़ेस्ट स्निपेट जोड़ा गया मेरे मैनिफ़ेस्ट XML में शामिल हैं:

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

–Edit

मेरे सिंक्रनाइज़ेशन सेवा से जुड़े मेरा सिंकैडैप्टर.एक्सएमएम इसमें शामिल है:

 <?xml version="1.0" encoding="utf-8"?> <sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="AUTHORITY" android:accountType="myaccounttype" android:supportsUploading="true" /> 

निश्चित नहीं कि अन्य कोड क्या उपयोगी होगा। अनुरोध करने के लिए भेजा गया खाता "myaccounttype" का है और कॉल करने के लिए दिया गया प्राधिकरण मेरे syc adapter xml से मेल खाता है।

क्या संसाधित करने का अनुरोध करने के लिए ContentResolver.requestSync सही तरीका है? ऐसा लगता है कि सिंक परीक्षक उपकरण सीधे सेवा से जुड़ा हुआ है और कॉल सिंक शुरू होता है, लेकिन ऐसा लगता है कि यह सिंक आर्किटेक्चर के साथ एकीकृत करने के उद्देश्य को धराशायी करता है

यदि यह एक सिंक का अनुरोध करने का सही तरीका है, तो सिंक परीक्षक क्यों काम करेगा, लेकिन ContentResolver.requestSync को मेरी कॉल नहीं करता? क्या मुझे बंडल में पास करने की जरूरत है?

मैं 2.1 और 2.2 चलाने वाले उपकरणों पर एमुलेटर में परीक्षण कर रहा हूं।

वेब के समाधान से एकत्रित समाधान "क्यों ContentResolver.requestSync एक समन्वयन को ट्रिगर नहीं करता?"

कॉलिंग requestSync() केवल एक {Account, ContentAuthority} जोड़ी पर कार्य करेगा जो सिस्टम के लिए ज्ञात है एंड्रॉइड को बताने के लिए आपके ऐप को कई चरणों के माध्यम से जाने की ज़रूरत है कि आप किसी विशेष प्रकार के खाते का उपयोग करके एक विशिष्ट प्रकार की सामग्री को सिंक्रनाइज़ करने में सक्षम हैं। यह AndroidManifest में करता है

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> 

<service> टैग का नाम विशेषता आपके क्लास का नाम है, सिंक्रनाइज़ेशन कनेक्ट करने के लिए … मैं उस पर एक सेकंड में बात करूंगा

निर्यात किए गए सत्य को सेट करना यह अन्य घटकों को दिखाई देता है (इसलिए आवश्यक है कि ContentResolver इसे कॉल कर सकते हैं)।

आशय फ़िल्टर यह सिंक का अनुरोध करने का इरादा पकड़ता है। (यह सामग्री ContentResolver से आता है जब आप ContentResolver.requestSync() या संबंधित शेड्यूलिंग विधियों को कॉल करते हैं।)

नीचे <meta-data> टैग पर चर्चा की जाएगी।

2. अपने SyncAdapter को खोजने के लिए एंड्रॉइड को एक सेवा प्रदान करें

तो कक्षा ही … यहाँ एक उदाहरण है:

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

आपकी कक्षा को Service या इसके उप-वर्गों में से एक को बढ़ाया जाना चाहिए, इसे public IBinder onBind(Intent) लागू करना होगा, और जब उसे कहा जाता है तो SyncAdapterBinder को वापस करना होगा … आपको टाइप public IBinder onBind(Intent) के प्रकार की आवश्यकता है। तो आप देख सकते हैं कि उस कक्षा में बहुत कुछ है। एकमात्र कारण यह है कि सेवा प्रदान करना है, जो एंड्रॉइड के लिए एक मानक इंटरफ़ेस प्रदान करता है जिससे कि आपकी SyncAdapter खुद ही आपकी कक्षा को SyncAdapter है।

3. वास्तव में सिंक करने के लिए एक class SyncAdapter प्रदान करें।

mySyncAdapter है जहां असली सिंक्रनाइज़ेशन तर्क खुद संग्रहीत है। इसकी onPerformSync() पद्धति को तब बुलाया जाता है जब उसे समन्वयित करने का समय आ जाता है मुझे लगता है कि आप पहले से ही जगह में हैं

4. खाता-प्रकार और एक सामग्री प्राधिकरण के बीच बंधन स्थापित करें

AndroidManifest पर फिर से देखें, हमारी सेवा में यह अजीब <meta-data> टैग मुख्य भाग है जो कि सामग्री प्राधिकरण और एक खाते के बीच बंधन स्थापित करता है। यह बाह्य रूप से एक और 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" /> 

ठीक है, तो यह क्या करता है? यह एंड्रॉइड को बताता है कि हमने सिंक एडैप्टर परिभाषित किया है (क्लास जिसे <service> टैग के नाम तत्व में बुलाया गया था जिसमें <meta-data> टैग शामिल है जो इस फ़ाइल का संदर्भ देता है …) एक से संपर्कों को सिंक करेगा com.google शैली खाता

आपकी सभी सामग्रीऑस्ट्रिटी स्ट्रिंग्स को सभी मैच करना पड़ता है, और आप सिंक्रनाइज़ कर रहे हैं के साथ मैच करते हैं – यह एक स्ट्रिंग है जिसे आप परिभाषित करते हैं, अगर आप अपना खुद का डाटाबेस बना रहे हैं, या आपको मौजूदा डिवाइस स्ट्रिंग्स का उपयोग करना चाहिए अगर आप ज्ञात कर रहे हैं डेटा प्रकार (जैसे संपर्क या कैलेंडर ईवेंट या आपके पास क्या है।) उपरोक्त ("com.android.contacts") संपर्क प्रकार डेटा (आश्चर्य, आश्चर्य की बात है) के लिए सामग्री प्राधिकरण स्ट्रिंग होते हैं।

अकाउंट टाईप को भी उन ज्ञात अकाउंट प्रकारों से मेल खााना है जो पहले से ही दर्ज किए गए हैं, या आप जिस एक को बना रहे हैं उससे मिलान करना होगा (यह आपके सर्वर पर एथैट प्राप्त करने के लिए AccountAuthenticator का उप-वर्ग बनाना शामिल है … एक आलेख, खुद के लिए मूल्य।) फिर, "com.google" परिभाषित स्ट्रिंग की पहचान है … google.com शैली खाता क्रेडेंशियल्स (फिर से, यह आश्चर्यचकित नहीं होना चाहिए।)

5. किसी दिए गए खाते / सामग्री प्राधिकारी जोड़ी पर समन्वयन सक्षम करें

अंत में, सिंक सक्षम होना चाहिए। आप अपने ऐप पर जाकर और मिलान वाले खाते में अपने ऐप के बगल में स्थित चेकबॉक्स को सेट करके नियंत्रण कक्ष में खाते और समन्वयन पृष्ठ में ऐसा कर सकते हैं। वैकल्पिक रूप से, आप इसे अपने ऐप में कुछ सेटअप कोड में कर सकते हैं:

 ContentResolver.setSyncAutomatically(account, AUTHORITY, true); 

सिंक होने के लिए, आपके खाता / प्राधिकारी जोड़ी को सिंक करने के लिए सक्षम होना चाहिए (ऊपर की तरह) और सिस्टम पर समग्र वैश्विक सिंक ध्वज सेट होना चाहिए, और डिवाइस में नेटवर्क कनेक्टिविटी होना चाहिए।

यदि आपका खाता / प्राधिकारी समन्वयन या वैश्विक सिंक अक्षम है, तो RequestSync () को कॉल करना एक प्रभाव होता है – यह एक झंडे सेट करता है कि सिंक का अनुरोध किया गया है, और जैसे ही सिंक सक्षम किया जाता है

साथ ही, प्रति एमजीवी , आपके अनुरोध के अतिरिक्त बंडल में ContentResolver.SYNC_EXTRAS_MANUAL को सेट करने के लिए सिंक, सिंक्रनाइज़ेशन को मजबूर करने के लिए एंड्रॉइड से पूछता है, भले ही वैश्विक सिंक बंद हो गया हो (यहां आपके उपयोगकर्ता का सम्मान हो!)

अंत में, आप एक समयबद्ध अनुसूचित समन्वयन सेटअप कर सकते हैं, फिर से ContentResolver फ़ंक्शंस के साथ।

6. कई खातों के निहितार्थ पर विचार करें

एक ही प्रकार के एक से अधिक खाते (एक उपकरण या दो फेसबुक अकाउंट्स, या दो ट्विटर अकाउंट्स आदि पर सेट किए गए दो @ जीमेल डॉट्स अकाउंट्स) हो सकते हैं … आपको यह करने के आवेदन पर विचार करना चाहिए। .. अगर आपके पास दो खाते हैं, तो आप शायद उन दोनों को एक ही डेटाबेस तालिकाओं में सिंक करने की कोशिश नहीं करना चाहते शायद आपको यह निर्दिष्ट करने की आवश्यकता है कि एक समय में केवल एक ही सक्रिय हो सकता है, और यदि आप खाते स्विच करते हैं तो तालिकाओं और रिशंक फ्लश करें (एक संपत्ति पेज के माध्यम से जो खातों मौजूद हैं पूछता है) शायद आप प्रत्येक खाते के लिए एक अलग डाटाबेस बनाते हैं, हो सकता है कि अलग-अलग टेबल, प्रत्येक तालिका में एक महत्वपूर्ण कॉलम हो। सभी विचार विशिष्ट और कुछ विचार के योग्य। ContentResolver.setIsSyncable(Account account, String authority, int syncable) यहां रुचि का हो सकता है। setSyncAutomatically() नियंत्रण करता है कि क्या खाता / प्राधिकारी जोड़ी को चेक या अनचेक किया गया है , जबकि setIsSyncable() लाइन को अचयनित और ग्रे करने का एक तरीका प्रदान करता है ताकि उपयोगकर्ता उसे चालू न कर सके। आप एक खाते को सिंक करने योग्य और अन्य सिंक करने योग्य (डीएसएबल) सेट कर सकते हैं।

7. ContentResolver.notifyChange से अवगत रहें ()

एक मुश्किल काम ContentResolver.notifyChange() ContentProvider द्वारा उपयोग किए जाने ContentProvider एक फ़ंक्शन है जो ContentProvider को सूचित करता है कि स्थानीय डेटाबेस बदल दिया गया है। यह दो कार्यों की सुविधा देता है, सबसे पहले, यह कर्सर को अद्यतन करने के लिए उस कन्टैंट का पालन करने के लिए कर्सर का कारण बनता है, और बदले में requery और अमान्य और एक ListView , आदि को फिर से तैयार करना … यह बहुत जादुई है, डेटाबेस परिवर्तन और आपके ListView केवल स्वचालित रूप से अद्यतन करता है बहुत बढ़िया। इसके अलावा, जब डेटाबेस बदलता है, एंड्रॉइड आपके सामान्य अनुसूची के बाहर, आपके लिए सिंक का अनुरोध करता है, ताकि ये बदलाव डिवाइस से हटाए जाएं और सर्वर से यथासंभव शीघ्रता से समन्वयित हो सके। इसके अलावा भयानक

हालांकि एक किनारे का मामला है यदि आप सर्वर से पुल करते हैं, और ContentProvider में किसी अपडेट को पुश करते हैं, तो यह कर्तव्य रूप से notifyChange() करेगा कॉल करें notifyChange() और एंड्रॉइड जाएगा, "ओह, डेटाबेस परिवर्तन, बेहतर उन्हें सर्वर पर डाल दें!" (डोह!) अच्छी तरह लिखित सामग्री ContentProviders पास कुछ परीक्षण देखने होंगे कि क्या परिवर्तन नेटवर्क से या उपयोगकर्ता से आया है, और बूलियन syncToNetwork झंडा झूठा सेट करेगा यदि ऐसा है तो इस बेकार डबल-सिंक को रोकने के लिए। यदि आप डेटा को किसी सामग्री ContentProvider में खिला रहे हैं, तो यह आपको यह काम करने के तरीके को समझने के लिए ContentProvider है- अन्यथा जब आप केवल एक की आवश्यकता होती है, तो आप हमेशा दो सिंक्रनाइज़ करने को समाप्त कर देंगे।

8. खुश रहो!

एक बार आपके पास यह सब XML मेडाटाटा है, और सिंक सक्षम है, एंड्रॉइड पता चलेगा कि आपके लिए सब कुछ कैसे कनेक्ट किया जाए, और समन्वयन काम करना शुरू कर दे। इस समय, बहुत सारी चीजें जो बहुत अच्छी हैं, वे सिर्फ जगह पर क्लिक करेंगे और यह जादू की तरह बहुत कुछ महसूस करेगा। का आनंद लें!