The document discusses sync functionality in Android applications. It covers key components of the sync architecture like AccountManager, SyncManager, ContentProvider and SyncAdapter. It explains how these components work together to allow syncing of data between a device and server, both for uploading and downloading of data. It also discusses some common issues developers face around sync implementation, like handling IDs and deleting accounts. It provides best practices for making the sync implementation robust, like being lenient on data fetching but strict on uploading, and including resync functionality in the initial version.
6. Not exactly the fresh topic...
„Developing Android REST client
applications”
by Virgil Dobjanschi
@Google I/O 2010
7. Not exactly the fresh topic...
„Synchronizacja danych z serwisami
webowymi w Androidzie”
by Bartosz Filipowicz
@KrakDroid 2011
8. Not exactly the fresh topic...
„Synchronizacja danych z serwisami
webowymi w Androidzie”
by Bartosz Filipowicz
@KrakDroid 2011
...but there is still much confusion
38. Authenticator Sync architecture
POST NEW DATA
AccountManager
UI
SyncManager ContentResolver
onPerformSync()
SyncAdapter ContentProvider
39. Authenticator Sync architecture
POST NEW DATA
getAuthToken()
AccountManager
UI
SyncManager ContentResolver
onPerformSync()
SyncAdapter ContentProvider
40. Authenticator Sync architecture
POST NEW DATA
getAuthToken()
AccountManager
UI
SyncManager ContentResolver
query()
onPerformSync() query()
SyncAdapter ContentProvider
41. Authenticator Sync architecture
POST NEW DATA
getAuthToken()
AccountManager
UI
SyncManager ContentResolver
query()
onPerformSync() query()
SyncAdapter POST
ContentProvider
42. Authenticator Sync architecture
GET NEW DATA
AccountManager
UI
SyncManager ContentResolver
onPerformSync()
SyncAdapter ContentProvider
43. Authenticator Sync architecture
GET NEW DATA
getAuthToken()
AccountManager
UI
SyncManager ContentResolver
onPerformSync()
SyncAdapter ContentProvider
44. Authenticator Sync architecture
GET NEW DATA
getAuthToken()
AccountManager
UI
SyncManager ContentResolver
onPerformSync()
SyncAdapter GET
ContentProvider
45. Authenticator Sync architecture
GET NEW DATA
getAuthToken()
AccountManager
UI
SyncManager ContentResolver
applyBatch()
onPerformSync()
applyBatch()
SyncAdapter GET
ContentProvider
46. Authenticator Sync architecture
GET NEW DATA
getAuthToken()
AccountManager
UI
SyncManager ContentResolver
applyBatch()
onPerformSync() notifyChange()
applyBatch()
SyncAdapter GET
ContentProvider
47. Authenticator Sync architecture
GET NEW DATA
getAuthToken()
AccountManager
onLoaderFinished()
UI
SyncManager ContentResolver
applyBatch()
onPerformSync() notifyChange()
applyBatch()
SyncAdapter GET
ContentProvider
48. Authenticator Sync architecture
WIN #1: NO REMOTE I/O IN UI
AccountManager
UI
SyncManager ContentResolver
SyncAdapter ContentProvider
52. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/1
Plan A: Use local IDs! (BaseColumns._ID)
53. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/1
Plan A: Use local IDs! (BaseColumns._ID)
ISSUE: still need server-side IDs for relations
54. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/1
Plan A: Use local IDs! (BaseColumns._ID)
ISSUE: still need server-side IDs for relations
ISSUE: conversions between server and local IDs
55. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/15002900
Plan B: OK, use server-side IDs!
56. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/15002900
Plan B: OK, use server-side IDs!
ISSUE: what about offline mode?
57. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/-42
content://com.futuresimple.krakdroid.Provider/datasets/15002900
Plan C: OK, let’s mix things up!
58. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/-42
content://com.futuresimple.krakdroid.Provider/datasets/15002900
Plan C: OK, let’s mix things up!
ISSUE: very tricky implementation
59. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/GUID
Plan D: GUID
60. IDs in ContentProvider URIs
content://com.futuresimple.krakdroid.Provider/datasets/GUID
Plan D: GUID
ISSUE: needs support on the backend
68. Deleting an account
<receiver
android:name=".auth.AccountBroadcastReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.accounts.LOGIN_ACCOUNTS_CHANGED" />
</intent-filter>
</receiver>
CONS: only info about existing accounts.
PROS: peace of mind.