9

複数の権限に対して 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 クラスなしでそれを達成するためのアイデアはありますか?

4

2 に答える 2

9

この質問は数か月前に提起されましたが、とにかく答えたいと思います...

onPerformSync()新しい SyncThread がスピンアップして同期操作を実行するときに呼び出されます。各 SyncAdapter は、 で定義された権限にバインドされた SyncThread をスピンアップしsync-adapter.xmlます。この xml ファイルで複数の権限を定義することはできません。

AbstractThreadedSyncAdapter (SyncAdapter スーパー クラス) は、複数の権限を処理するように作成されていません。シングルトンとして実装された最終ISyncAdapterImplクラスが含まれているため、呼び出されるたびにstartSync()、同じ権限を使用して同期が行われます。

@xml/syncadapter2または、最初に SyncService 内に追加のメタデータとして追加しようとしましたか? これは、複数の SyncAdapter を 1 つの SyncService に登録することと同じです。技術的には実行可能ですが (サービス タグ内に複数のメタデータ タグを定義できるため) service.onBind(Intent intent)、同期を実行するときにサービスを呼び出すのは OS 自体であり、それが渡す意図を簡単に制御することはできません。それを制御できれば、バインドする登録済みの syncAdapter を決定するキーをインテントのバンドルに入れることができます。そしてそれでも厳しいようです。

そうは言っても、機関ごとに異なる SyncAdapter を (独自のサービスでも) 実装し、同様の操作を で呼び出される Utility クラスに抽象化する方が労力は少なくなりますonPerformSync()。いずれにせよ、この戦略は長期的には保守性が高くなります。ContentProvider の 1 つを削除する必要がある場合、対応する SyncAdapter と SyncService を削除する方が簡単だからです。

于 2013-02-09T22:31:43.950 に答える
1

これが正しい答えかどうかはわかりません。

  1. onBind同期アダプターが関連付けられている機関とは関係ありません。呼び出し元がサービスとの通信に使用するインターフェイスを返すだけです。
  2. サービスの実装 (インターフェースを提供する) は、同期される権限とは何かを理解する責任があります。これは呼び出しで行われますonPerformSync
  3. から派生する実装は、AbstractThreadedSyncAdapter同期ごとに呼び出される可能性があるため、スレッドセーフである必要があります。

したがって、それは「不可能」ではなく、サービスの正しい実装に関するものです。1 つのサービスに複数の同期アダプターを実装することは、オーソリティによって実装内で切り替えるだけで、複数のアダプターを登録することと同じです。

于 2013-07-17T04:18:51.690 に答える