旋转屏幕时出现多个智能锁定对话框

7
我最近将Google的智能锁密码功能集成到我的应用程序中,几乎一切都按照预期顺利运行。
只有一个小问题我还没有解决:在ResultCallback#onResult中,如果status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED,则以下命令会导致出现一个Google分辨率对话框,询问是否通过Smart Lock保存凭据(请参见附图)或者如果已经在Smart Lock中保存了多个凭据,则使用哪些凭据。
status.startResolutionForResult(getActivity(), REQUEST_CODE_READ);

当分辨率对话框出现时,如果用户进行了某些方向的更改,则会导致分辨率对话框变成多个,每个对话框会彼此重叠。作为用户,您可能首先没有看到有多个对话框,但是如果您关闭第一个(通过点击“从不”或“保存密码”),则最上面的对话框将消失,揭示下面另一个相同的对话框。请注意,上述内容中的HTML标记已被保留。
2个回答

6
您可以通过在活动启动和停止之间保持一些状态来处理此问题。
请参见此示例代码中使用mIsResolving变量的方式。只需在调用onSaveInstanceState()时保存是否已经有一个待处理的对话框,然后在onCreate()中恢复,并在收到意图的onActivityResult()后清除状态,防止再次调用API。
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;
...

这是许多应用程序常见的陷阱,因此我们将研究是否可以在Play服务层支持此状态,但目前,对于保持分辨率状态,使用活动布尔值是当前和普遍的建议。


0

我知道这是一个老问题,但最近我不得不处理这个问题,在我的情况下,我在自定义类中使用了status.startResolutionForResult(),并且我没有任何访问onSaveInstanceState()的权限(我可以使用接口创建一些自定义回调,但我不想这样做),但在我的自定义类中,我有一个活动实例,所以在调用startResolutionForResult()之前,我总是检查mActivity.hasWindowFocus()来查看活动是否失去焦点,因为显示对话框,如果是真的,那么我调用startResolutionForResult(),否则我什么也不做

@Override
public void onResult(@NonNull LocationSettingsResult result) {

    final Status status = result.getStatus();
    switch (status.getStatusCode()){
        case LocationSettingsStatusCodes.SUCCESS:

            getLocation();
            break;
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

            if (mActivity.hasWindowFocus()) {
                try {
                    status.startResolutionForResult(mActivity, SETTINGS_CHECK);
                } catch (IntentSender.SendIntentException e) {
                    e.printStackTrace();
                }
            }
            break;
        case  LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

            mReceiver.unableToObtainLocation();
            break;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接