【问题标题】:Android: Design consideration for periodic syncing with Sync AdapterAndroid:使用 Sync Adapter 进行定期同步的设计注意事项
【发布时间】:2014-10-27 04:40:44
【问题描述】:

我在我的应用程序中使用同步适配器。该应用程序应每 3 小时执行一次同步。这可以通过ContentResolver.addPeriodicSync 完成。但是,在此之前,对于每个同步请求,我都需要发送用户的访问令牌。令牌的到期时间为 2 小时。因此,在任何同步请求之前,它需要有一个有效的访问令牌。如果访问令牌已过期,则需要为用户更新一个新令牌。

我想出的一个解决方案是使用AlarmManager 设置重复警报。当警报触发时,IntentService 将启动。并刷新用户的访问令牌。获得新令牌后,同步请求将发送到SyncAdapter,使用ContentResolver.requestSync。我不确定这是否是一种好方法或任何其他有效的方法。

【问题讨论】:

  • 你让用户在同步时手动请求访问令牌怎么样?
  • 应用会每隔 3 小时在后台自动同步数据。如何检查用户是否正在使用应用程序,何时触发定期同步。 gmail、facebook 或 twitter 等应用程序永远不会要求用户一次又一次地同步输入他们的数据。他们遵循什么方法来做到这一点?
  • 大多数访问令牌都带有一个刷新令牌,可让您获得一个新令牌。
  • @ianhanniballake 是的,我有。仅使用它,我正在刷新访问令牌。我的问题是当同步定期运行时,不知道访问令牌是否有效。所以我已经发布了我想出的解决方案,以在我的帖子的后半部分处理这个问题。我不确定这是否是正确的方法,还是有更有效的方法。
  • 很抱歉,我的声明“用户手动请求访问令牌”可能让您感到困惑。我的意思是您不必创建警报来刷新令牌,只需在使用同步适配器同步数据时执行即可。

标签: android android-syncadapter


【解决方案1】:

您应该能够使用 AccountManager 在 OnPerformSync 中刷新您的令牌。

查看此演示应用程序,该应用程序使用自定义同步适配器来同步与使用自定义内容提供程序的 Google 帐户绑定的 Google 任务数据。

https://github.com/sschendel/SyncManagerAndroid-DemoGoogleTasks

演示应用在 OnPerformSync 中使用 GoogleAuthUtil.getTokenWithNotification,但(理论上)您应该能够在传递到 OnPerformSync 的帐户上使用 AccountManager.getAuthToken 执行相同的操作。

来自 Android 文档AccountManager.getAuthToken

获取特定帐户的指定类型的身份验证令牌,如果用户必须输入凭据,则可选择发出通知。此方法适用于不应立即因密码提示而中断用户的后台任务和服务。

如果为该帐户和类型缓存了先前生成的身份验证令牌,则将其返回。否则,如果保存的密码可用,则将其发送到服务器以生成新的身份验证令牌。否则,将返回一个 Intent,该 Intent 在启动时会提示用户输入密码。如果设置了 notifyAuthFailure 参数,还会创建一个具有相同 Intent 的状态栏通知,提醒用户他们需要在某个时候输入密码。

【讨论】:

    【解决方案2】:

    我建议您仅在发现无法再使用的令牌时才尝试检索新令牌。这种方法应该是首选,因为这样您就不会在应用程序中对令牌的有效期进行硬编码。

    它还处理服务器端可能在有效期结束之前不时因任何原因使每个人的令牌无效的情况。

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多