14

我有一个与 Web 服务链接的应用程序,该服务使用 AccountManager 和 Sync 来允许用户通过应用程序登录到他们的帐户并同步他们的数据(这是自定义数据,而不是联系人或 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 数据!”?还是我不得不忍受的谷歌帐户/同步框架中固有的东西?

4

1 回答 1

2

我认为(尽管我不是 100% 确定)这是一个省电功能;发送一个长传输而不是几个较短的传输更节省电池电量,因为无线电在传输结束后会在一段时间内处于待机电源状态,因此发送一个长传输可以避免停留在待机状态(本质上是浪费功率)不止一次。所以我猜测同步基础设施会尝试尽可能多地进行同步。

如果关注的是第一次同步的延迟,也许除了定期自动同步之外,您还可以手动请求第一次同步的同步时间更短?

于 2013-05-09T11:23:44.450 回答