2011-11-05 12 views
5

मेरे पास एक ऐप है जिसमें कई गतिविधियां शामिल हैं, और मैं सभी गतिविधियों के बीच डेटा और ऑब्जेक्ट्स साझा करने के लिए एप्लिकेशन कॉन्टेक्स्ट (एप्लिकेशन क्लास से जुड़ा हुआ है, और मैंने इसे लगातार बना दिया है) का उपयोग किया है। मैं कई अच्छे कारणों से पृष्ठभूमि सेवा के बजाय एप्लिकेशन क्लास का उपयोग करता हूं, जिसे मैं यहां नहीं जाऊंगा।Android में सिंक एडाप्टर सेवा से पहले से चल रहे एप्लिकेशन संदर्भ का उपयोग कैसे करें?

मैंने हाल ही में अपने ऐप में कस्टम संपर्क सिंक एडाप्टर भी जोड़ा है। यह एक ही पैकेज में है, उसी एपीके में। इसलिए, मैंने अपने ऐप में अन्य सभी चीज़ों की तरह एप्लिकेशन कॉन्टेक्स्ट तक पहुंचने के लिए इसे सभी साझा डेटा और ऑब्जेक्ट तक पहुंच प्रदान करने के लिए सेट अप किया है। हालांकि, भले ही यह काम करता है (ज्यादातर), यह एप्लिकेशन संदर्भ का एक नया उदाहरण बनाता है। तो मेरे आवेदन के मूल रूप से 2 अलग-अलग उदाहरण चल रहे हैं, और डेटा उनके बीच साझा नहीं किया जाता है।

मुझे लगता है कि समस्या यह है कि मेरा आवेदन कभी सिंक सेवा शुरू नहीं करता है, ओएस करता है। मेरी सभी अन्य गतिविधियां या तो एप्लिकेशन द्वारा शुरू की जाती हैं, या मुख्य गतिविधि एप्लिकेशन कॉन्टेक्स्ट को लॉन्च होने पर एक्सेस करती है, और फिर ऐप संदर्भ अन्य सभी को नियंत्रित करता है। क्या नया तरीका बनाने के बजाय सिंक सेवा मौजूदा एप्लिकेशन संदर्भ तक पहुंचने का कोई तरीका है?

आवेदन

package com.mycomany.myapp;  
public class MyApp extends Application{ 
    ... 
} 

Activity1

package com.mycomany.myapp; 
public class MyActivity1 extends Activity{ 
    MyApp a; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     a = (MyApp) getApplicationContext(); 
     ... 
    } 
} 

SyncAdapterService

:

यहाँ मेरी एप्लिकेशन की बुनियादी संरचना है 0

package com.mycomany.myapp; 
public class SyncAdapterService extends Service { 
    private static SyncAdapterImpl sSyncAdapter = null; 
    private static final Object sSyncAdapterLock = new Object(); 
    private static ContentResolver mContentResolver = null; 
    private static MyApp a; 

    public SyncAdapterService() { 
     super(); 
    } 

    private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter { 
     private Context mContext; 

     public SyncAdapterImpl(Context context) { 
      super(context, true); 
      mContext = context; 
     } 

     @Override 
     public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { 
      try { 
       SyncAdapterService.performSync(mContext, account, extras, authority, provider, syncResult); 
      } catch (OperationCanceledException e) {} 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     synchronized (sSyncAdapterLock) { 
      if(a == null){ 
       a = (MyApp) getApplicationContext(); 
      } 
      if (sSyncAdapter == null) { 
       sSyncAdapter = new SyncAdapterImpl(getApplicationContext()); 
      } 
     } 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return sSyncAdapter.getSyncAdapterBinder(); 
    } 

    private static void performSync(Context context, Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) 
      throws OperationCanceledException { 
... 
    } 
} 

उत्तर

7

काम कर रहा है है आप प्रतिलिपि & SyncAdapter http://developer.android.com/training/sync-adapters/creating-sync-adapter.html के लिए इस प्रशिक्षण चिपकाया?

<service 
      android:name="com.example.android.datasync.SyncService" 
      android:exported="true" 
      android:process=":sync"> 
     <intent-filter>com.example.android.datasync.provider 
      <action android:name="android.content.SyncAdapter"/> 
     </intent-filter> 
     <meta-data android:name="android.content.SyncAdapter" 
       android:resource="@xml/syncadapter" /> 
    </service> 
विशेषता Android के साथ

: प्रक्रिया = ": सिंक" आप किसी अलग समन्वयन प्रक्रिया बनाने के अर्थ

अंत में इस एक्सएमएल स्निपेट है। इसे हटा दें और आप जाने के लिए अच्छे हैं।

+0

की तरह खराब कर दिया गया था क्षमा करें - मैंने इसे बहुत समय पहले समझा था, लेकिन समाधान – user496854

+0

समाधान पोस्ट करना भूल गया। मैं बस इतना ही स्थिति में था और इस सवाल पर ठोकर खाई। मेरा SyncAdapter ऐप्स SharedDefaultPreferences को ओवरराइट कर रहा था और इसके विपरीत (वे थ्रेड हैं लेकिन प्रक्रिया-सुरक्षित नहीं हैं)। –

+0

धन्यवाद माइकल ... यह मेरी समस्या को हल करने में भी मदद करता है ... – Ram

1

आप अपने आवेदन संदर्भ में सेवा को बाध्यकारी देखना चाहते हैं। इस तरह, यदि आपका एप्लिकेशन संदर्भ मौजूद नहीं है, तो सेवा मौजूद नहीं होगी, क्योंकि यह उसी प्रक्रिया (एप्लिकेशन की) में चलती है। bindSerivce()

देखें आपकी सेवा एक दूरस्थ एक callbacks

+1

मुझे यकीन नहीं है कि यह संभव है - यह एक सिंक एडाप्टर सेवा है, इसलिए मेरा ऐप तकनीकी रूप से इसके साथ कभी भी बातचीत नहीं करता है। यह सिंक ट्रिगर होने पर सामग्री रिज़ॉल्वर द्वारा ट्रिगर (बनाया और बाध्य) हो जाता है। मैं इसे अपने ऐप से कैसे बांध सकता हूं? – user496854

1

का उपयोग कर आप अभी भी इस समस्या हो रही है कोशिश है? यदि सेवा को आपकी मेनिफेस्ट फ़ाइल में एक अलग एंड्रॉइड निर्दिष्ट किए बिना घोषित किया गया है: प्रक्रिया, क्या यह आपके कार्य द्वारा परिभाषित डिफ़ॉल्ट प्रक्रिया में नहीं चलनी चाहिए? क्या आप उस मामले में नहीं हो सकते हैं जो आपको प्राप्त करने के लिए getAplicationContext का उपयोग करें? मैं अपने सिंक अनुकूलक इस तरह से लागू कर दिया है और यह

+0

यह चाहिए, लेकिन किसी कारण से यह नहीं है।getAplicationContext एक अलग ऐप इंस्टेंस – user496854

+0

खींचता है, इसलिए आपका सिंक एडाप्टर एक अलग प्रोजेक्ट में नहीं है (एक अलग मैनिफेस्ट के साथ) न ही मैनिफेस्ट में निर्दिष्ट एक अलग प्रक्रिया है? – kingston

+0

मेरी ग्रहण परियोजना के साथ कुछ गलत या दूषित होना चाहिए, या मैं मैनिफेस्ट में कुछ याद कर सकता था। मैंने खरोंच से एक नई परियोजना तैयार की, सभी जावा स्रोत फ़ाइलों की प्रतिलिपि बनाई, और फिर खरोंच से मैनिफेस्ट को दोबारा शुरू किया। एक बार ऐसा करने के बाद, सबकुछ काम करता था जैसा कि चाहिए - GetplicationContext ठीक उसी तरह काम करता था जैसा इसे माना जाता था। मुझे अभी भी पता नहीं है कि मूल परियोजना को – user496854

संबंधित मुद्दे