しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

ContentResolver#requestSyncメソッドでContentProviderへの同期を早くする

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