2012-09-20 21 views
9

我想重用我的SyncAdapter多個權限。方法 onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult)將權限作爲參數傳遞。但是我怎麼能這樣註冊呢?如何爲多個權限使用一個SyncAdapter類?

我開始在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類?

回答

9

這個問題個月前提出的,但我想反正回答...

onPerformSync()當一個新的SyncThread紡爲執行同步操作被調用。每個SyncAdapter都會創建一個與sync-adapter.xml中定義的權限綁定的SyncThread,並且無法在此xml文件中定義多個權限。

AbstractThreadedSyncAdapter(SyncAdapter超類)完全不是爲了處理多個權限而編寫的。它包含一個作爲Singleton實現的最終ISyncAdapterImpl類,因此每次調用startSync()時,將使用相同的權限進行同步。

或者,你最初是否試圖在SyncService中添加@xml/syncadapter2作爲附加的元數據?這相當於將多個SyncAdapter註冊到單個SyncService。這在技術上是可行的(因爲你可以在服務標籤中定義多個元數據標籤),但是當它運行同步時,操作系統本身就是你的服務調用service.onBind(Intent intent)的罪魁禍首,你無法輕易控制它傳遞的意圖。如果你可以控制它,你可以在intent的bundle中放一個鍵來決定你綁定哪個註冊的syncAdapter。即使這似乎很難。所有這些都說明,爲每個權威實現不同的SyncAdapter(也包括他們自己的服務)並將類似的操作抽象爲一個在onPerformSync()中調用的Utility類。無論如何,從長遠來看,此策略更易於維護,因爲如果需要刪除其中一個ContentProvider,則可以更輕鬆地刪除其相應的SyncAdapter和SyncService。

1

我不太確定這是一個正確的答案。

  1. onBind與同步適配器關聯的權限無關。它應該返回一個調用者用來與服務通信的接口。
  2. 服務實現(提供接口)負責理解什麼是要同步的權限。這在呼叫onPerformSync中完成。
  3. AbstractThreadedSyncAdapter派生的實現必須是線程安全的,因爲它可能被調用每個同步。

所以,這不是關於「不可能」,而是關於服務的正確實施。在一個服務中實現幾個同步適配器相當於只需通過權威機構切換內部實現來註冊多個適配器。

+0

我將此添加到由kianatennyson製作的答案中。出於某種原因,我無法對她的回答添加評論。 – LeonidVlad

+0

感謝您的貢獻,您不能在其他人的帖子上發表評論,直到您擁有足夠的聲望(50) –

相關問題