9

我想为多个权限重用我的 SyncAdapter。该方法 onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)将权限作为参数传递。但是我怎样才能以这种方式注册呢?

我从 AndroidManifest.xml 中的以下内容开始:

<service
    android:name=".sync.SyncService" >
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>

    <meta-data
        android:name="android.content.SyncAdapter"
        android:resource="@xml/syncadapter1" />
</service>

我尝试了不同的注册方式,@xml/syncadapter2但没有成功。在没有为每个权限派生的 SyncAdapter 类的情况下实现这一目标的任何想法?

4

2 回答 2

9

这个问题是几个月前提出的,但我还是想回答......

onPerformSync()在启动新的 SyncThread 以执行同步操作时调用。每个 SyncAdapter 都会启动一个 SyncThread,该 SyncThread 绑定到 中定义的权限sync-adapter.xml,并且在这个 xml 文件中不能定义多个权限。

AbstractThreadedSyncAdapter(SyncAdapter 超类)根本不是为了处理多个权限而编写的。它包含一个ISyncAdapterImpl作为 Singleton 实现的最终类,因此每次startSync()调用时,都会使用相同的权限进行同步。

或者,您最初是否尝试@xml/syncadapter2在 SyncService 中添加额外的元数据?这相当于将多个 SyncAdapter 注册到单个 SyncService。它在技术上是可行的(因为您可以在服务标签中定义多个元数据标签)但是操作系统本身是在service.onBind(Intent intent)运行同步时调用您的服务的罪魁祸首,并且您无法轻松控制它传递的意图。如果您可以控制它,您可以在意图的包中放置一个键,该键将确定要绑定哪些已注册的同步适配器。即便如此,这似乎也很艰难。

综上所述,为每个权限实现不同的 SyncAdapter(也使用他们自己的服务),并将类似的操作抽象到一个在onPerformSync(). 无论如何,从长远来看,这种策略更易于维护,因为如果需要删除其中一个 ContentProvider,则删除其对应的 SyncAdapter 和 SyncService 会更容易。

于 2013-02-09T22:31:43.950 回答
1

我不确定这是一个正确的答案。

  1. onBind与同步适配器关联的权限无关。它只应该返回一个接口,调用者将使用该接口与服务进行通信。
  2. 服务实现(提供接口)负责了解什么是要同步的权限。这是在通话中完成的onPerformSync
  3. 派生自 的实现AbstractThreadedSyncAdapter必须是线程安全的,因为每次同步都可能调用它。

因此,这不是关于“不可能”,而是关于服务的正确实施。在一个服务中实现多个同步适配器相当于注册多个适配器,只需通过权限切换内部实现即可。

于 2013-07-17T04:18:51.690 回答