理解Android认证中的意图

理解Android认证中的意图,android,authentication,android-intent,Android,Authentication,Android Intent,在处理身份验证时,我对Android架构有一些疑问 假设我为需要进行身份验证的特定帐户调用AccountManager.getAuthToken。假设身份验证由于密码错误而失败。AbstractAccountAuthenticator合同要求验证者返回一个带有活动的捆绑包,该活动通过密钥意图处理用户名/密码输入 我的问题是:谁应该显示UI?Android是否会自动检测到存在KEY\u INTENT并运行UI,或者我的代码是否必须startActivity,其意图体现在AccountManager

在处理身份验证时,我对Android架构有一些疑问

假设我为需要进行身份验证的特定帐户调用
AccountManager.getAuthToken
。假设身份验证由于密码错误而失败。
AbstractAccountAuthenticator
合同要求验证者返回一个带有
活动的
捆绑包
,该活动通过
密钥意图
处理用户名/密码输入

我的问题是:谁应该显示UI?Android是否会自动检测到存在
KEY\u INTENT
并运行UI,或者我的代码是否必须
startActivity
,其意图体现在
AccountManager
的响应中?这同样适用于
AccountManager.addAccount
,它通过一个将来的接口绑定结果

在哪里可以找到关于这些主题的教程


谢谢

当出现
按键意图时,系统不会自动显示活动。
这取决于你是否开始这项活动

下面是一些示例代码:

private AccountManagerCallback<Bundle> mAccountManagerCallback = new AccountManagerCallback<Bundle>() {

    public void run(AccountManagerFuture<Bundle> future) {

        Bundle bundle;
        try {

            bundle = future.getResult();
            //if an intent was sent, start the required activity
            if (bundle.containsKey(AccountManager.KEY_INTENT)) {
                Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);

                //clear the new task flag just in case, since a result is expected
                int flags = intent.getFlags();
                flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK;
                intent.setFlags(flags);

                startActivityForResult(intent, REQUEST_CODE_AUTH);

        } else {
            //otherwise, just get the credentials
            if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
                    String authToken    = bundle.getString(AccountManager.KEY_AUTHTOKEN);
                    String userMail     = bundle.getString(AccountManager.KEY_ACCOUNT_NAME);
                    //use the credentials
            }
        }
      }
      catch(...) {
        ...
        //handle errors, maybe retry your getAuthToken() call
      }
    }
}
private accountmanager callback maccountmanager callback=new accountmanager callback(){
公共作废运行(AccountManagerFuture){
束;
试一试{
bundle=future.getResult();
//如果发送了意图,则启动所需的活动
if(bundle.containsKey(AccountManager.KEY_INTENT)){
Intent Intent=bundle.getParcelable(AccountManager.KEY\u Intent);
//清除新任务标志以防万一,因为预期会有结果
int flags=intent.getFlags();
标志&=~Intent.FLAG\u活动\u新任务;
意图。设置标志(标志);
startActivityForResult(意图、请求、代码、授权);
}否则{
//否则,只需获取凭据即可
if(bundle.containsKey(AccountManager.KEY\u AUTHTOKEN)){
String authToken=bundle.getString(AccountManager.KEY\u authToken);
String userMail=bundle.getString(AccountManager.KEY\u ACCOUNT\u NAME);
//使用凭据
}
}
}
捕获(…){
...
//若要处理错误,请重试getAuthToken()调用
}
}
}
我希望这就是你想要的,但如果我没有正确理解你的问题,请澄清


干杯

如果我没有使用回调怎么办?我问这个问题是因为我想知道,如果验证器返回了一个意图,UI是否以及必须做什么。系统是自动显示还是必须在调用者中实现代码?我开始认为只有系统才能运行intent,因为它必须使用与帐户创建者相同的UID运行。我真的很困惑[补充]我想你的第一句话就是答案:每个来电者都必须实现所有逻辑。。。