ContentResolverのrequestSyncというメソッドで同期を早くできるという話があったので検証してみました
それとrequestSyncはシステムのリソースを多く使うという話もありました、実装する際はその辺りも検証しつつ導入した方が良さそうです
今回はGoogleカレンダーの予定の同期で試してみました
requestSyncではaccountが必要なのでaccount取得のためにAndroidManifest.xmlに下のパーミッションを追加します
最初はGET_ACCOUNTSを追加したのですが、うまく動かなかったのでREAD_CONTACTSに変更しました(検証OSバージョンは12)
<uses-permission android:name="android.permission.READ_CONTACTS" />
次はアカウント取得の権限がない場合に許可を求めるアラートを表示します
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS), 100) }
実際の同期処理は下の通りです
accountを取得してからそれを使ってContentResolver.requestSyncを呼び出しています
同期を行いたいタイミングに下の処理を追加します
AccountManager.get(context).getAccountsByType("com.google").firstOrNull()?.let { account -> val extras = Bundle() extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true) extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true) extras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true) ContentResolver.requestSync(account, CalendarContract.AUTHORITY, extras) }
実装できたらアプリで予定を作成してからGoogleカレンダーアプリに反映されるまでの時間を各3回測定してみました
測定結果は下の通りです
requestSyncを使うと即時変更される事が分かりました
requestSyncなし…46秒、76秒、65秒 requestSyncあり…0秒、0秒、12秒
参考URL
2.15. ContentProvider の発展 · mixi-inc/AndroidTraining Wiki · GitHub