方向更改时的多个智能锁定对话框

Joh*_*ler 7 android google-api google-smartlockpasswords

我最近将Google的Smart Lock for Passwords功能集成到了我的应用程序中,几乎所有内容都按预期顺利运行.

还有一个我无法解决的小问题:在ResultCallback#onResult,如果status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED以下命令导致呈现Google解决方案对话框,询问是否通过Smart Lock保存凭据(请参阅附图)或使用哪些凭据,如果Smart Lock中已保存多个凭据:

status.startResolutionForResult(getActivity(), REQUEST_CODE_READ);
Run Code Online (Sandbox Code Playgroud)

Google Smart Lock对话框:使用Smart Lock保存密码? 从不或保存密码

当呈现分辨率对话框,并且用户进行一些方向更改时,分辨率对话框会相乘,每个对话框都会重叠.作为用户,您首先看不到对话框的多个副本,但是如果您关闭第一个对话框(通过点击"从不"或"保存密码"),则最上面的对话框将消失,从而在下面显示另一个相同的对话框.

Ste*_*eff 6

您可以通过在活动开始和停止之间保持一些状态来处理此问题.

请参阅mIsResolving示例代码中的变量的使用.只需保存在onSaveInstanceState()调用和恢复时是否已存在待处理对话框onCreate(),并防止再次调用API,如果onActivityResult()收到,则清除状态一次.

private void resolveResult(Status status, int requestCode) {
    // We don't want to fire multiple resolutions at once since that can result
    // in stacked dialogs after rotation or another similar event.
    if (mIsResolving) {
        Log.w(TAG, "resolveResult: already resolving.");
        return;
    }
    if (status.hasResolution()) {
        try {
            status.startResolutionForResult(MainActivity.this, requestCode);
            mIsResolving = true;
...

@Override
protected void onCreate(Bundle savedInstanceState) {
...
    if (savedInstanceState != null) {
        mIsResolving = savedInstanceState.getBoolean(KEY_IS_RESOLVING);
    }
...

@Override
protected void onSaveInstanceState(Bundle outState) {
...
    outState.putBoolean(KEY_IS_RESOLVING, mIsResolving);
...

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
...
            mIsResolving = false;
...
Run Code Online (Sandbox Code Playgroud)

这是许多应用程序的常见缺陷,因此我们将研究是否可以在Play服务层中支持此状态,但是目前,使用活动的布尔值是维护解决状态的当前和一般建议.