Im using SyncAdapter for some server client synchronization. In the official
developer guide
<http://developer.android.com/training/sync-adapters/running-sync-adapter.html>
it
is mentioned that there are different methods to trigger a sync.
*1 Run the Sync Adapter When Server Data Changes*
You simply call:
ContentResolver.requestSync(ACCOUNT, AUTHORITY, null);
When server data changes (on GCM for example).
*2 Run the Sync Adapter When Content Provider Data Changes*
Simply use a ContentObserver
public class TableObserver extends ContentObserver {
@Override
public void onChange(boolean selfChange) {
onChange(selfChange, null);
}
@Override
public void onChange(boolean selfChange, Uri changeUri) {
ContentResolver.requestSync(ACCOUNT, AUTHORITY, null);
}
}
*3 Run the Sync Adapter After a Network Message*
Do the following:
ContentResolver.setSyncAutomatically(ACCOUNT, AUTHORITY, true)
Now everytime when there is an open TCP/IP connection the SyncAdapter is
triggered to perform the sync.
*4 Run the Sync Adapter Periodically*
This is for me the important and interesting part. For that you simply have
to do this (at least this is written in the developers guide):
public static final long SECONDS_PER_MINUTE = 60L;
public static final long SYNC_INTERVAL_IN_MINUTES = 60L;
public static final long SYNC_INTERVAL = SYNC_INTERVAL_IN_MINUTES *
SECONDS_PER_MINUTE;
ContentResolver.addPeriodicSync(
ACCOUNT,
AUTHORITY,
Bundle.EMPTY,
SYNC_INTERVAL);
*Now to the problem*
Solution 1, 2 and 3 are working perfectly as they should. The periodical
sync does not. If i just do what is descriped under point 4 the
synchronization is never triggered (yes i did enable the auomatic
synchronisation in the system settings of my android device).
If i do the following:
ContentResolver.setIsSyncable(account, ContentProviderMeasure.AUTHORITY, 1);
ContentResolver.setSyncAutomatically(account, ContentProviderMeasure.
AUTHORITY, true);
ContentResolver.addPeriodicSync(account, ContentProviderMeasure.AUTHORITY,
new Bundle(), 3600);
The SyncAdapter sync refresh is called every minute (it should be every
hour / 3600 seconds = 1 hour). If i do the following:
ContentResolver.setIsSyncable(account, ContentProviderMeasure.AUTHORITY, 1);
ContentResolver.addPeriodicSync(account, ContentProviderMeasure.AUTHORITY,
new Bundle(), 3600);
The sync is only triggered once at creation time and after that never
again. Yes, as i mentioned already, the automatic sync in the android
devices settings is enabled.
Triggering the sync manually for my app in the android device settings
accountmanager is working fine.
*So why does the periodic sync does not work?*
I tested on Nexus 4 with Android 6.0, On Galaxy Ace with Android 4.4 and on
Galaxy S3 Mini with Android 4.1. All devices are not syncing periodically.
I also posted my question on
Stackoverflow:
http://stackoverflow.com/questions/35879056/sync-not-triggered-as-mentioned-in-developer-guide
--
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit
https://groups.google.com/d/msgid/android-developers/0591242e-86c5-4146-a892-7921296bcf35%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.