如何为多个权限使用一个SyncAdapter类?

我想重用我的SyncAdapter用于多个权限。 方法onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)将权限作为parameter passing。 但是我怎么能这样注册呢?

我开始在AndroidManifest.xml中跟随:

       

我尝试了不同的方式注册@xml/syncadapter2但没有成功。 没有为每个权限派生SyncAdapter类的任何想法?

这个问题是几个月前提出的,但无论如何我想回答……

当新的SyncThread被旋转以执行同步操作时,将调用onPerformSync() 。 每个SyncAdapter都会旋转一个SyncThread,该SyncThread绑定到sync-adapter.xml定义的权限,并且无法在此xml文件中定义多个权限。

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

或者,您最初是否尝试将@xml/syncadapter2添加为@xml/syncadapter2中的其他元数据? 这相当于将多个SyncAdapter注册到单个SyncService。 它在技术上是可行的(因为你可以在服务标签中定义多个元数据标签)但是操作系统本身就是在运行同步时调用service.onBind(Intent intent)的罪魁祸首,你不能轻易控制它通过的意图。 如果你可以控制它,你可以在intent的包中放一个键来决定你要绑定哪个注册的syncAdapter。 即使这似乎很难。

总而言之,为每个权限(也使用自己的服务)实现不同的SyncAdapter并将类似的操作抽象到在onPerformSync()调用的Utility类中的onPerformSync() 。 从长远来看,这种策略更易于维护,因为如果需要删除其中一个ContentProviders,则更容易删除其相应的SyncAdapter和SyncService。

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

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

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