Android 根据帐户设置调用的顺序,未调用SyncAdapter

Android 根据帐户设置调用的顺序,未调用SyncAdapter,android,sync,accounts,Android,Sync,Accounts,我在SyncAdapter上遇到了一些稍微奇怪的行为 我第一次安装我的应用程序时(使用adb卸载后),它会启动并创建一个帐户。根据某些语句的顺序(见下文),永远不会调用我的SyncAdapter的onPerformSync();“帐户和同步”下的我的帐户显示“正在同步”图标。如果我随后取消选中应用程序帐户旁边的同步复选框,然后重新选中,则会立即调用我的onPerformSync() 这将导致永远不会调用我的SyncAdapter。“正在同步”图标将永远旋转,除非我取消选中,然后重新选中同步复选框

我在SyncAdapter上遇到了一些稍微奇怪的行为

我第一次安装我的应用程序时(使用adb卸载后),它会启动并创建一个帐户。根据某些语句的顺序(见下文),永远不会调用我的SyncAdapter的onPerformSync();“帐户和同步”下的我的帐户显示“正在同步”图标。如果我随后取消选中应用程序帐户旁边的同步复选框,然后重新选中,则会立即调用我的onPerformSync()

这将导致永远不会调用我的SyncAdapter。“正在同步”图标将永远旋转,除非我取消选中,然后重新选中同步复选框:

final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
mAccountManager.addAccountExplicitly(account, mPassword, null);
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
通过对相同语句的排序,所有语句都能完美运行:

final Account account = new Account(mUsername, getString(R.string.ACCOUNT_TYPE));
ContentResolver.setSyncAutomatically(account, getString(R.string.CONTENT_AUTHORITY), true);
ContentResolver.setIsSyncable(account, getString(R.string.CONTENT_AUTHORITY), 1);
mAccountManager.addAccountExplicitly(account, mPassword, null);
我的猜测是,由于SyncManager在创建帐户时立即触发同步请求,我将SyncManager置于不一致的状态,并且我正在更改它脚下的配置。但是(几乎没有连贯性的)文档没有提到在您喜欢的时候调用这些函数的任何问题

我发现
contentResolver.requestSync()
永远不会触发您的
SyncAdapter.onPerformSync()
,除非您调用
contentResolver.setIsSyncable(account,getString(R.string.CONTENT\u AUTHORITY),1)

有人能解释一下这种行为吗?关于帐户和同步的文档至少可以说有些不清楚


我在2.1模拟器上得到了这种行为,是针对2.1 SDK编译的。

我发现
contentResolver.requestSync()
永远不会触发您的SyncAdapter.onPerformSync(),除非您调用
contentResolver.setIsSyncable(account,getString(R.string.CONTENT\u AUTHORITY),1)

有关我使用SyncAdapter的解决方案的详细说明,请参见我的回答:


我只是把头撞在墙上好几个小时,想弄明白为什么周期同步不起作用。事实证明,轮询频率需要以秒(文字)为单位,而不是以毫秒为单位,也不是以毫秒为单位的秒。因此,例如,如果您希望它每分钟半同步一次,您需要调用:

            ContentResolver.addPeriodicSync(
                    account,
                    authority,
                    Bundle.EMPTY,
                    90
            );

此外,传入的bundle不能像文档中那样为null,它将抛出NullPointerException

+1!我们花了好几个小时的时间才看到这一点,并打电话给setIsSyncable!非常感谢。信息量很大。请为您自己的问题写一个答案,以便我们知道它不再在“未命名”列表中。我已更新了我的问题,以便问题部分更清晰。我希望有人解释或详细说明为什么会发生这种行为。@JarrodSmith请回答您的问题并将其标记为已回答。我也面临同样的问题,谢谢您的回答。