我有一个与使用AccountManager和Sync的Web服务相关联的应用,允许用户通过应用登录到他们的帐户并同步他们的数据(这是自定义数据,而不是Google帐户使用的联系人或其他任何内容)。 AFAIK,我正按照我应该的方式做所有事情。当用户通过我们的API登录时,我将他们的帐户保存到Android AccountManager:
AccountManager am = AccountManager.get(context);
m.addAccountExplicitly(new Account(username, ACCOUNT_TYPE), account_id, user_data);
我已将ACCOUNT_TYPE定义为应用的包名称,这足以将其与任何其他帐户类型区分开来。
添加帐户后,我会将其设置为自动同步:
ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
ContentResolver.addPeriodicSync(account, AUTHORITY, new Bundle(), SYNC_FREQUENCY_SECONDS);
我已将SYNC_FREQUENCY_SECONDS定义为86400(即1天)。
同样,如果用户注销,我只需从AccountManager中检索他们的帐户并调用removeAccount()将其删除。好又简单。
同步是通过我自己的代码执行的,因为它是正在同步的所有自定义数据,并且一切正常。然而,令我发疯的是,无论何时我使用此代码添加或删除帐户(我自己的类型),它都会立即触发设备上所有Google帐户的同步。这意味着,在同步我的数据之前,首先必须同步所有电子邮件,日历数据,联系人,Google Play杂志,Google+数据和图片等等。这可能需要几分钟,在此期间我的应用只是耐心等待轮到同步数据。这非常令人沮丧,我的用户很难理解为什么一旦他们登录就需要这么长时间来同步他们的数据(更不用说当它同步那么多数据时,手机有慢慢的趋势)几乎到了无反应的程度)。
我在这里做错了吗?我的代码中是否存在无意中告诉Android的内容,“嘿,现在就去同步所有Google数据!”?或者,它是Google必须忍受的Google帐户/同步框架中固有的东西吗?
答案 0 :(得分:2)
我认为(虽然我不是100%肯定)这是一个节电功能;发送一个长传输而不是几个较短的传输更节省电池效率,因为无线电在传输结束后的一段时间内保持待机电源状态,因此发送单个长传输避免保持待机状态(基本上是浪费不止一次。所以我猜测同步基础设施尝试尽可能多地同步批处理。
如果问题是第一次同步的延迟,那么除了定期自动同步之外,您是否可以手动请求同步以进行首次同步?