Android:与同步适配器定期同步的设计考虑

Android:与同步适配器定期同步的设计考虑,android,android-syncadapter,Android,Android Syncadapter,我正在我的应用程序中使用同步适配器。应用程序应每3小时执行一次同步。这可以通过ContentResolver.addPeriodicSync完成。但是,在此之前,对于每个同步请求,我都需要发送用户的访问令牌。代币的到期时间为2小时。因此,在任何同步请求之前,它需要有一个有效的访问令牌。如果访问令牌已过期,则需要为用户更新新令牌 我提出的一个解决方案是使用AlarmManager设置重复报警。当警报触发时,IntentService将启动。并刷新用户的访问令牌。获得新令牌后,将使用ContentR

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


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

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

签出此演示应用程序,该应用程序使用自定义同步适配器同步绑定到使用自定义内容提供商的Google帐户的Google任务数据

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

来自Android文档:

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

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


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


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

让用户在同步时手动请求访问令牌如何?应用程序将每隔3小时在后台自动同步数据。如何检查用户是否正在使用应用程序,何时触发定期同步。gmail、facebook或twitter等应用程序从不要求用户一次又一次地同步输入数据。他们采用什么方法来实现这一点?大多数访问令牌都带有一个刷新令牌,允许您获取一个新令牌。@ianhanniballake是的,我有。仅使用它,我正在刷新访问令牌。我的问题是,当同步定期运行时,不知道访问令牌是否有效。因此,我在文章的后半部分发布了我提出的解决方案,以解决这个问题。我不确定这是一种正确的方法还是有更有效的方法。很抱歉,我的声明“用户手动请求访问令牌”可能会让您感到困惑。我的意思是,您不必创建警报来刷新令牌,只需在使用同步适配器同步数据时创建警报即可。