Как получить доступ к уже запущенной службе контекста приложения из службы адаптера синхронизации в Android?

У меня есть приложение, состоящее из нескольких действий, и я использую контекст приложения (полученный из класса приложения, и я сделал его постоянным) для обмена данными и объектами между всеми действиями. Я использую класс приложений вместо фонового сервиса по нескольким веским причинам, которые я не буду здесь вдаваться.

Недавно я также добавил в приложение пользовательский адаптер синхронизации контактов. Он под тем же пакетом, в том же APK. Так Я настроил его для доступа к контексту приложения, как и ко всему остальному в моем приложении, чтобы предоставить ему доступ ко всем общим данным и объектам. Однако, несмотря на то, что он работает (в основном), он создает новый экземпляр контекста приложения. Таким образом, в основном выполняется 2 отдельных экземпляра моего приложения, и данные не передаются между ними.

Я думаю, что проблема в том, что мой Applicattion никогда не запускает службу синхронизации, а ОС это делает. Все остальные мои действия либо запускаются приложением, либо основное действие обращается к контексту приложения при его запуске, а затем контекст приложения управляет всем остальным. Есть ли способ получить доступ к службе синхронизации к существующему контексту приложения вместо создания нового его экземпляра?

Вот базовая структура моего приложения:

Приложение

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

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 {
...
    }
}
5
задан Bill the Lizard 6 July 2013 в 14:18
поделиться