Android 在服务中等待getAuthToken意图结果

Android 在服务中等待getAuthToken意图结果,android,android-intent,android-service,android-authenticator,Android,Android Intent,Android Service,Android Authenticator,首先,动机: 我正在构建一个应用程序,它可以从通过AccountManager获得的Android服务中获益,但并非绝对需要。在这种情况下,我构建应用程序时没有GET\u ACCOUNTS和USE\u CREDENTIALS权限,而是选择构建一个服务插件进行授权,用户可以选择安装该插件。现在,这个插件完全按照预期工作,除了一个突出的问题:我可以启动从getAuthToken(…)返回的Intent,请求初始授权,但我不能等待它完成 那么,现在已经知道为什么我要从服务调用getAuthToken(

首先,动机:

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

那么,现在已经知道为什么我要从
服务调用
getAuthToken(…)
而不是从
活动调用
,有人知道我如何在返回令牌之前等待授权
意图完成吗?基本上,在下面的代码中,是否有人知道如何在
authIntent
完成之前推迟返回
token

...
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 = ???
}
。。。
会计经理未来会计经理未来;
accountManagerFuture=accountManager.getAuthToken(帐户[0],“android”,true,null,null);
Bundle authTokenBundle=accountManagerFuture.getResult();
if(authTokenBundle.containsKey(AccountManager.KEY\u AUTHTOKEN))
token=authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN.toString();
else if(authTokenBundle.containsKey(AccountManager.KEY_INTENT)){
Intent authIntent=(Intent)authTokenBundle.getParcelable(AccountManager.KEY\u Intent);
authIntent.addFlags(Intent.FLAG\u活动\u新任务);
背景。起始触觉(authIntent);
...
//我知道我不会在这里设置令牌,这只是为了强调
//我想在authIntent完成后设置它
令牌=???
}

另外,如果知道有任何用处,那么上面的代码位于
异步任务
中。这会很难看,但也许我可以轮询
getAuthToken(…)
,直到它不再返回
意图为止?不过,我必须相信还有比这更好的解决方案。

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

  • 服务
    插件仅设计用于与父应用程序接口
  • 父应用程序不会连续调用插件
  • getAuthToken(…)
    返回的授权
    Intent
    很少被调用(可能只有一次)
  • 运行来自
    getAuthToken(…)
    Intent
    后,后续调用将返回有效令牌(如果用户授予权限)或无效令牌(如果用户未授予权限)
  • 出现授权提示时,父应用将暂停
  • 考虑到以上所有因素,我认为当授权提示成为焦点时,我可以在父应用程序的
    onPause()
    中调用
    unbindService(…)
    。授权提示完成后,我可以在
    onResume()
    中调用
    bindService(…)
    ,然后在后续时间调用与
    getAuthToken(…)
    关联的任务。此时,由于已应用授权提示(假设用户正常交互),父应用程序将获得(有效或无效)令牌,就好像
    服务
    已等待
    意图
    完成一样

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

    不管怎样,这就是我得到的。欢迎提出任何其他建议/关切