Posted at

SyncAdapter の管理をうまいことまとめるやつを作った話

More than 5 years have passed since last update.

https://github.com/nohana/Eligor

SyncAdapterといえば、知る人ぞ知る機能な感じも有りますが、簡単に言うと AccountManager の Account に紐付いて、クラウドデータとの同期をバックグラウンドで自動的に実行してくれる仕組みです。

フレームワークが実行のタイミングを制御するので、アプリケーションを作る上では、呼び出しによって実行される手続きをテンプレートに沿って記述すれば良いことになります。

このあたりの詳しい話は、こちらにまとまったドキュメントが有ります。

SyncAdapter 自体は、アプリケーションが複数個保持することが出来るようになっています。

そして、SyncAdapter そのものを直接扱うことはほとんどありませんが、その管理は ContentResolver によって行われます。

この SyncAdapter の管理の、ContentResolver の static なメソッドを介して行う部分について、ラップしたオブジェクトを用いて透過的に取り扱えるようにしたのが、このライブラリになります。


初期化と登録

Applicationの拡張クラスで、初期化処理を行います。


public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();

Eligor.initialize(1000); // sync period is set by default as every 1sec

Eligor.getInstance().registerPeriodicSyncManager(new PeriodicSyncManager(new Account("account_name", "account_type"), "authority")); // register manager
}

@Override
public void onTerminate() {
Eligor.destroy();
super.onTerminate();
}
}

オブジェクトの初期化はEligor#initialize(int)で行います。

この後、アプリケーションが持つ SyncAdapter に関する情報をEligor#registerPeriodicSyncManager(IPeriodicSyncManager)で登録します。

同期を実行する ContentProvider の Authority ごと Account を紐付ける形になります。

必要があれば、Eligor#applyPeriod()で同期間隔を登録し、システムに同期の開始を依頼します。


その他の操作

手動で同期する場合は、Eligor#requestSync()を呼び出します。


public class MyActivity extends Activity {
private final Eligor mEligor = Eligor.getInstance(); // you may inject the instance by DI container using Provider.

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_sample)
}

public void onSyncButtonClick(View view) {
mEligor.requestSync(); // start provider sync manually
}
}

SyncAdapter の操作に関するメソッドには、Authority 文字列を受け取るものとそうでないものが有ります。

Authority 文字列を受け取らないものは、Eligorに登録したすべての SyncAdapter に対して操作を実行します。

対して、Authority 文字列を受け取るものは、対応する SyncAdapter にのみ操作を実行するようになります。