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

ole*_*leh 9 android synchronization

我想重用我的SyncAdapter用于多个权限.Method 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>
Run Code Online (Sandbox Code Playgroud)

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

小智 9

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

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

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

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

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