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