我有一个应用程序,包含多个活动,并且我使用Application Context(从Application Class扩展而来,并将其设置为持久化)在所有活动之间共享数据和对象。我使用Application Class而不是后台服务,有几个很好的原因,这里不再详细解释。
最近,我还向我的应用程序添加了自定义联系人同步适配器。它位于相同的包中,与同一APK文件中。因此,我将其设置为像应用程序中的其他所有内容一样访问Application Context,以便让它访问所有共享的数据和对象。然而,尽管它基本上可以工作,但它会创建Application Context的新实例。因此,基本上运行两个独立的应用程序实例,并且数据不能在它们之间共享。
我认为问题在于我的应用程序从未启动同步服务,而是由操作系统启动。我的所有其他活动都是由应用程序启动的,或者主要活动在启动时访问Application Context,然后App Context控制其他所有内容。是否有办法让同步服务访问现有的Application Context,而不是创建新实例?
以下是我的应用程序的基本结构:
应用程序
最近,我还向我的应用程序添加了自定义联系人同步适配器。它位于相同的包中,与同一APK文件中。因此,我将其设置为像应用程序中的其他所有内容一样访问Application Context,以便让它访问所有共享的数据和对象。然而,尽管它基本上可以工作,但它会创建Application Context的新实例。因此,基本上运行两个独立的应用程序实例,并且数据不能在它们之间共享。
我认为问题在于我的应用程序从未启动同步服务,而是由操作系统启动。我的所有其他活动都是由应用程序启动的,或者主要活动在启动时访问Application Context,然后App Context控制其他所有内容。是否有办法让同步服务访问现有的Application Context,而不是创建新实例?
以下是我的应用程序的基本结构:
应用程序
package com.mycomany.myapp;
public class MyApp extends Application{
...
}
活动1
package com.mycomany.myapp;
public class MyActivity1 extends Activity{
MyApp a;
@Override
public void onCreate(Bundle savedInstanceState){
a = (MyApp) getApplicationContext();
...
}
}
同步适配器服务
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 {
...
}
}