Service 如何从Android中的同步适配器服务访问已经运行的应用程序上下文?
我有一个包含多个活动的应用程序,我使用应用程序上下文(从应用程序类中删除,并使其持久化)在所有活动之间共享数据和对象。我之所以使用应用程序类而不是后台服务,有几个很好的理由,我在这里不赘述 我最近还在我的应用程序中添加了一个自定义联系人同步适配器。它在同一个包裹里,在同一个APK里。因此,我将其设置为访问应用程序上下文,就像我的应用程序中的所有其他内容一样,允许其访问所有共享数据和对象。然而,即使它可以工作(大部分),它也会创建应用程序上下文的新实例。因此,我的应用程序基本上有两个独立的实例在运行,并且数据不在它们之间共享 我认为问题在于我的应用程序从未启动同步服务,而操作系统却启动了。我的所有其他活动要么由应用程序启动,要么主活动在启动时访问应用程序上下文,然后应用程序上下文控制所有其他内容。有没有办法让同步服务访问现有的应用程序上下文,而不是创建它的新实例 以下是我的应用程序的基本结构: 应用程序Service 如何从Android中的同步适配器服务访问已经运行的应用程序上下文?,service,sync,android,Service,Sync,Android,我有一个包含多个活动的应用程序,我使用应用程序上下文(从应用程序类中删除,并使其持久化)在所有活动之间共享数据和对象。我之所以使用应用程序类而不是后台服务,有几个很好的理由,我在这里不赘述 我最近还在我的应用程序中添加了一个自定义联系人同步适配器。它在同一个包裹里,在同一个APK里。因此,我将其设置为访问应用程序上下文,就像我的应用程序中的所有其他内容一样,允许其访问所有共享数据和对象。然而,即使它可以工作(大部分),它也会创建应用程序上下文的新实例。因此,我的应用程序基本上有两个独立的实例在运
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 {
...
}
}
您可能需要研究将服务绑定到应用程序上下文。这样,如果应用程序上下文不存在,服务将不存在,因为它在同一进程(应用程序的进程)中运行。看
如果您的服务是远程服务,请尝试使用您是否仍有此问题? 如果服务在清单文件中声明,但没有指定其他android:process,那么它不应该在任务定义的默认进程中运行吗? 在这种情况下,您不能使用getApplicationContext来获取所需内容吗?
我用这种方式实现了我的同步适配器,它正在工作您是否为同步适配器复制并粘贴了此培训 最后是这个XML片段:
<service
android:name="com.example.android.datasync.SyncService"
android:exported="true"
android:process=":sync">
<intent-filter>com.example.android.datasync.provider
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
<meta-data android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter" />
</service>
com.example.android.datasync.provider
属性为android:process=“:sync”表示您创建了一个单独的同步进程。删除它,您就可以开始了。我不确定这是否可能——它是一个同步适配器服务,所以我的应用程序在技术上永远不会与它交互。它在触发同步时由内容解析器触发(创建和绑定)。我如何将它绑定到我的应用程序?它应该绑定,但由于某些原因它没有绑定。getApplicationContext调出不同的应用程序实例,因此您的同步适配器不在单独的项目中(具有不同的清单),也没有在清单中指定不同的进程?我的Eclipse项目一定有问题或损坏,或者我可能遗漏了清单中的某些内容。我最终从头开始创建一个新项目,复制所有java源文件,然后从头开始重新创建清单。一旦我这么做了,一切都正常工作了——getApplicationContext完全按照它应该的方式工作。我仍然不知道是什么原因导致最初的项目像那样搞砸了对不起——我很久以前就知道了,但是忘了发布解决方案没有问题。我只是遇到了几乎相同的情况,在这个问题上绊倒了。我的SyncAdapter正在覆盖应用程序SharedDefaultPreferences,反之亦然(它们是线程但不是进程安全的)。非常感谢。他也在为共同偏好的混乱而挣扎。