等待服务中的getAuthToken Intent结果

时间:2014-10-02 21:14:26

标签: android android-intent android-service android-authenticator

首先,动机:

我构建的应用程序可以从AccountManager获得的Android服务中受益,但并非绝对需要。在这种情况下,我构建的应用程序没有GET_ACCOUNTSUSE_CREDENTIALS权限,而是选择构建Service插件进行授权,用户可以选择安装。现在,这个插件完全按预期工作,除了一个明显的问题:我可以启动从Intent返回的getAuthToken(...)请求初始授权,但我不能等待它完成。

所以,现在我知道为什么要从getAuthToken(...)而不是Service拨打Activity,是否有人知道如何等待授权{{1}在返回令牌之前完成?基本上,在下面的代码中,是否有人知道在Intent完成之前如何推迟返回token

authIntent

此外,如果知道任何用途,则上述代码位于... AccountManagerFuture<Bundle> accountManagerFuture; accountManagerFuture = accountManager.getAuthToken(accounts[0], "android", true, null, null); Bundle authTokenBundle = accountManagerFuture.getResult(); if (authTokenBundle.containsKey(AccountManager.KEY_AUTHTOKEN)) token = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString(); else if (authTokenBundle.containsKey(AccountManager.KEY_INTENT)) { Intent authIntent = (Intent) authTokenBundle.getParcelable(AccountManager.KEY_INTENT); authIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(authIntent); ... // I know that I wouldn't set token here; this is just to emphasize // that I want to set it after authIntent completes token = ??? } 内。它很难看,但也许我可以轮询AsyncTask,直到它不再返回getAuthToken(...)为止?不过,我必须相信那里有一个更好的解决方案。

1 个答案:

答案 0 :(得分:0)

这不是最好的答案,我确定,但我认为它应该适用于我的具体情况。即,以下限制适用:

  1. Service插件仅用于与父应用程序接口。
  2. 父应用不会持续调用插件。
  3. Intent返回的授权getAuthToken(...)很少被调用(可能只有一次)。
  4. 运行Intent getAuthToken(...)后,后续调用将返回有效令牌(如果用户授予权限)或无效令牌(如果用户未授予权限)
  5. 在授权提示出现时暂停父应用程序。
  6. 考虑到上述所有情况,我认为当授权提示成为焦点时,我可以在父应用的unbindService(...)中调用onPause()。授权提示完成后,我可以在bindService(...)中调用onResume(),然后在随后的时间调用与getAuthToken(...)相关联的任务。那时,由于已经应用了授权提示(假设正常的用户交互),父应用程序将获得(有效或无效)令牌,就像Service等待Intent一样完整。

    我可以通过此方法看到的问题涉及用户在未先终止授权Intent的情况下恢复父应用。我还没有对此案进行过测试,但怀疑很多情况取决于getAuthToken(...)如何确定何时返回Intent

    无论如何,这就是我所拥有的。任何其他建议/关注都将受到欢迎。