0

首先,动机之内:等待getAuthToken意图结果的服务

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

所以,现在它被称为我为什么要叫getAuthToken(...)ServiceActivity代替,没有人知道我可以等待授权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?不过,我必须相信还有比这更好的解决方案。

回答

0

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

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

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

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

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