Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Service 如何从Android中的同步适配器服务访问已经运行的应用程序上下文?_Service_Sync_Android - Fatal编程技术网

Service 如何从Android中的同步适配器服务访问已经运行的应用程序上下文?

Service 如何从Android中的同步适配器服务访问已经运行的应用程序上下文?,service,sync,android,Service,Sync,Android,我有一个包含多个活动的应用程序,我使用应用程序上下文(从应用程序类中删除,并使其持久化)在所有活动之间共享数据和对象。我之所以使用应用程序类而不是后台服务,有几个很好的理由,我在这里不赘述 我最近还在我的应用程序中添加了一个自定义联系人同步适配器。它在同一个包裹里,在同一个APK里。因此,我将其设置为访问应用程序上下文,就像我的应用程序中的所有其他内容一样,允许其访问所有共享数据和对象。然而,即使它可以工作(大部分),它也会创建应用程序上下文的新实例。因此,我的应用程序基本上有两个独立的实例在运

我有一个包含多个活动的应用程序,我使用应用程序上下文(从应用程序类中删除,并使其持久化)在所有活动之间共享数据和对象。我之所以使用应用程序类而不是后台服务,有几个很好的理由,我在这里不赘述

我最近还在我的应用程序中添加了一个自定义联系人同步适配器。它在同一个包裹里,在同一个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,反之亦然(它们是线程但不是进程安全的)。非常感谢。他也在为共同偏好的混乱而挣扎。