【问题标题】:Wait for getAuthToken Intent Result within a Service等待服务中的 getAuthToken Intent 结果
【发布时间】:2014-10-02 21:14:26
【问题描述】:

一、动机:

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

所以,既然知道了为什么我想从Service 而不是Activity 调用getAuthToken(...),有谁知道我可以如何等待授权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?不过,我必须相信有比这更好的解决方案。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多