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

时间:2012-09-20 10:20:10

标签: android synchronization

我想重用我的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类的任何想法?

2 个答案:

答案 0 :(得分:9)

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

当新的SyncThread被启动以执行同步操作时,将调用

onPerformSync()。每个SyncAdapter都会旋转一个绑定到sync-adapter.xml中定义的权限的SyncThread,并且无法在此xml文件中定义多个权限。

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

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

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

答案 1 :(得分:1)

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

  1. onBind与与同步适配器关联的权限无关。它应该返回一个接口,调用者将使用该接口与服务进行通信。
  2. 服务实现(提供接口)负责了解要同步的权限。这是在电话onPerformSync中完成的。
  3. AbstractThreadedSyncAdapter派生的实现必须是线程安全的,因为每次同步都可以调用它。
  4. 因此,它不是“不可能”,而是关于正确实施服务。在一个服务中实现多个同步适配器相当于仅通过权限切换内部实现来注册多个适配器。