Android:与Sync Adapter定期同步的设计考虑因素

时间:2014-10-27 04:40:44

标签: android android-syncadapter

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

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

2 个答案:

答案 0 :(得分:2)

您应该可以使用AccountManager在OnPerformSync中刷新令牌。

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

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

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

来自Android文档AccountManager.getAuthToken

  

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

     

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

答案 1 :(得分:0)

如果您发现您拥有的令牌不能再使用,我建议您只尝试检索新令牌。这种方法应该是首选,因为您不需要在应用程序中对令牌的有效期进行硬编码。

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