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.

Reply via email to