У меня есть приложение, состоящее из нескольких действий, и я использую контекст приложения (полученный из класса приложения, и я сделал его постоянным) для обмена данными и объектами между всеми действиями. Я использую класс приложений вместо фонового сервиса по нескольким веским причинам, которые я не буду здесь вдаваться.
Недавно я также добавил в приложение пользовательский адаптер синхронизации контактов. Он под тем же пакетом, в том же 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 {
...
}
}