0

一、动机:

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

所以,既然知道了为什么我想getAuthToken(...)从 aService而不是a 调用Activity,有谁知道我如何在返回令牌之前等待授权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(...)直到它不再返回Intent? 不过,我必须相信有比这更好的解决方案。

4

1 回答 1

0

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

  1. Service插件仅用于与父应用程序交互。
  2. 父应用不会持续调用插件。
  3. Intent返回的授权getAuthToken(...)很少被调用(可能只有一次)。
  4. Intent运行from后getAuthToken(...),后续调用将返回有效令牌(如果用户授予权限)或无效令牌(如果用户未授予权限)。
  5. 出现授权提示时,父应用程序会暂停。

鉴于以上所有情况,我认为当授权提示成为焦点时,我可以调用unbindService(...)onPause()应用程序。授权提示完成后,我可以调用bindService(...)onResume()然后调用与getAuthToken(...)后续时间关联的任务。那时,由于已经应用了授权提示(假设正常的用户交互),父应用程序将获得(有效或无效)令牌,就好像Service等待Intent完成一样。

我可以通过这种方法看到的问题涉及用户在没有首先终止授权的情况下带回父应用程序Intent。我还没有测试过这种情况,但怀疑很大程度上取决于如何getAuthToken(...)确定何时返回Intent.

无论如何,这就是我所拥有的。欢迎任何其他建议/疑虑。

于 2014-10-03T03:29:14.147 回答