我使用SyncAdapter
进行某些服务器客户端同步。在official android developer guide中提到了触发同步的方法不同。
你只需致电:
ContentResolver.requestSync(ACCOUNT, AUTHORITY, null);
当服务器数据发生变化时(例如,在GCM上)。
只需使用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);
}
}
执行以下操作:
ContentResolver.setSyncAutomatically(ACCOUNT, AUTHORITY, true)
现在,每当有开放的TCP / IP连接时,都会触发SyncAdapter
执行同步。
这对我来说是重要而有趣的部分。为此你只需要这样做(至少这是在开发人员指南中写的):
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);
解决方案1,2和3正如他们应该的那样完美地工作。期刊同步没有。如果我只是执行第4点描述的内容,则永远不会触发同步(是的,我确实在我的Android设备的系统设置中启用了自动同步)。
如果我执行以下操作:
ContentResolver.setIsSyncable(account, ContentProviderMeasure.AUTHORITY, 1);
ContentResolver.setSyncAutomatically(account, ContentProviderMeasure.AUTHORITY, true);
ContentResolver.addPeriodicSync(account, ContentProviderMeasure.AUTHORITY, new Bundle(), 3600);
每分钟调用SyncAdapter
同步刷新(应该是每小时/ 3600秒= 1小时)。如果我执行以下操作:
ContentResolver.setIsSyncable(account, ContentProviderMeasure.AUTHORITY, 1);
ContentResolver.addPeriodicSync(account, ContentProviderMeasure.AUTHORITY, new Bundle(), 3600);
同步仅在创建时触发一次,之后再也不会触发。是的,正如我已经提到的,启用了Android设备设置中的自动同步。
在Android设备设置帐户管理器中为我的应用手动触发同步工作正常。
那为什么定期同步不起作用?
我在Android 6.0的Nexus 4,Android 4.4的Galaxy Ace以及Android 4.1的Galaxy S3 Mini上进行了测试。所有设备都没有定期同步。
答案 0 :(得分:5)
我已为Calendar
AUTHORITY 实施了定期同步。
在清单文件中添加 <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
权限。
为同步添加以下方法:
public void syncAllAccountsPeriodically(Context contextAct, long seconds) throws Exception {
AccountManager manager = AccountManager.get(contextAct);
Account[] accounts = manager.getAccountsByType("com.google");
String accountName = "";
String accountType = "";
for (Account account : accounts) {
accountName = account.name;
accountType = account.type;
break;
}
Account a = new Account(accountName, accountType);
ContentResolver.addPeriodicSync(a, "com.android.calendar", new Bundle(), seconds*1000);
}
我希望这会对你有所帮助。