我想重用我的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类的任何想法?
答案 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)
我不确定这是一个正确答案。
onBind
与与同步适配器关联的权限无关。它应该返回一个接口,调用者将使用该接口与服务进行通信。 onPerformSync
中完成的。 AbstractThreadedSyncAdapter
派生的实现必须是线程安全的,因为每次同步都可以调用它。因此,它不是“不可能”,而是关于正确实施服务。在一个服务中实现多个同步适配器相当于仅通过权限切换内部实现来注册多个适配器。