मेरे पास एक ऐप है जिसमें कई गतिविधियां शामिल हैं, और मैं सभी गतिविधियों के बीच डेटा और ऑब्जेक्ट्स साझा करने के लिए एप्लिकेशन कॉन्टेक्स्ट (एप्लिकेशन क्लास से जुड़ा हुआ है, और मैंने इसे लगातार बना दिया है) का उपयोग किया है। मैं कई अच्छे कारणों से पृष्ठभूमि सेवा के बजाय एप्लिकेशन क्लास का उपयोग करता हूं, जिसे मैं यहां नहीं जाऊंगा।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 {
...
}
}
की तरह खराब कर दिया गया था क्षमा करें - मैंने इसे बहुत समय पहले समझा था, लेकिन समाधान – user496854
समाधान पोस्ट करना भूल गया। मैं बस इतना ही स्थिति में था और इस सवाल पर ठोकर खाई। मेरा SyncAdapter ऐप्स SharedDefaultPreferences को ओवरराइट कर रहा था और इसके विपरीत (वे थ्रेड हैं लेकिन प्रक्रिया-सुरक्षित नहीं हैं)। –
धन्यवाद माइकल ... यह मेरी समस्या को हल करने में भी मदद करता है ... – Ram