首先,动机:
我构建的应用程序可以从AccountManager
获得的Android服务中受益,但并非绝对需要。在这种情况下,我构建的应用程序没有GET_ACCOUNTS
和USE_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(...)
为止?不过,我必须相信那里有一个更好的解决方案。
答案 0 :(得分:0)
这不是最好的答案,我确定,但我认为它应该适用于我的具体情况。即,以下限制适用:
Service
插件仅用于与父应用程序接口。Intent
返回的授权getAuthToken(...)
很少被调用(可能只有一次)。Intent
getAuthToken(...)
后,后续调用将返回有效令牌(如果用户授予权限)或无效令牌(如果用户未授予权限) 考虑到上述所有情况,我认为当授权提示成为焦点时,我可以在父应用的unbindService(...)
中调用onPause()
。授权提示完成后,我可以在bindService(...)
中调用onResume()
,然后在随后的时间调用与getAuthToken(...)
相关联的任务。那时,由于已经应用了授权提示(假设正常的用户交互),父应用程序将获得(有效或无效)令牌,就像Service
等待Intent
一样完整。
我可以通过此方法看到的问题涉及用户在未先终止授权Intent
的情况下恢复父应用。我还没有对此案进行过测试,但怀疑很多情况取决于getAuthToken(...)
如何确定何时返回Intent
。
无论如何,这就是我所拥有的。任何其他建议/关注都将受到欢迎。