防止 Dialog(或 DialogFragment)在应用进入后台时关闭

Prevent Dialog (or DialogFragment) from closing when app goes to background

我的应用向用户显示进度或 AlertDialog 是很常见的。如果用户将应用程序置于后台,然后 returns 之后,我希望 Dialog 仍然显示。有没有办法让 Android 处理这个问题?我希望它要么不关闭对话框,要么在 Activity 恢复时自动重新打开它。

目前看来没有。我还没有找到大量关于此的结果(大多数人 运行 遇到方向更改问题,我的应用程序不允许这样做)但很少有人询问是否进入后台。我已经尝试了 DialogFragment 和常规 Dialog 的每个排列,但是当按下主页按钮并从任务管理器打开应用程序时,它们都会消失。

我什至没有任何代码可以展示,因为它都处于在线各种示例的测试阶段。我怀疑我必须自己管理它,如果应该显示某些内容,请检查 onResume()。如果是这种情况我可以接受,但我想确定一下。

首先让我们弄清楚一些事情,就像您在下图中看到的那样,您的 activity 或片段可能因多种原因而被破坏,因此您必须处理您想要保存的内容 "the state of your dialog"。

现在代码:

public class CustomProgressDialog extends Dialog {

    private static final String SHOWING_PROGRESS_DIALOG = "showing_progress_dialog";
    private static final String STRING_PROGRESS_DIALOG = "string_progress_dialog";
    private static final String SHOWING_POP_UP_DIALOG = "showing_pop_up_dialog";
    private static final String STRING_POP_UP_DIALOG = "string_pop_up_dialog";

    public TextView textView;

    public CustomProgressDialog(Context context) {
        super(context, android.R.style.Theme_Translucent_NoTitleBar);

        setContentView(R.layout.progress_layout);

        setCancelable(false);

        textView = (TextView) findViewById(R.id.progress_textView);
    }

}


public class MasterActivity extends FragmentActivity {
    private CustomProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_master);

        progressDialog = new CustomProgressDialog(this);

        if (savedInstanceState != null) {
            boolean showingDialog = savedInstanceState.getBoolean(SHOWING_PROGRESS_DIALOG);
            if (showingDialog) {
                String msg = savedInstanceState.getString(STRING_PROGRESS_DIALOG, getResources().getString(R.string.progress_default_text));
                progressDialog.textView.setText(msg);
                progressDialog.show();
            }

            boolean mShowing_PopUpdialog = savedInstanceState.getBoolean(SHOWING_POP_UP_DIALOG);
            String temp_msg = savedInstanceState.getString(STRING_POP_UP_DIALOG, "");

            if (mShowing_PopUpdialog)
                showPopUpDialog(temp_msg);
            }
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        if (progressDialog.isShowing()) {
            outState.putBoolean(SHOWING_PROGRESS_DIALOG, true);
            outState.putString(STRING_PROGRESS_DIALOG, progressDialog.textView.getText().toString());
        }

        if (alert != null && alert.isShowing()) {
            outState.putBoolean(SHOWING_POP_UP_DIALOG, true);
            outState.putString(STRING_POP_UP_DIALOG, mString_dialog);
        }
    }
}

在你的 DialogFragment 中试试这个 onPause() 做这个

@Override   
public void onPause() {
super.onPause();
getActivity().getSupportFragmentManager().beginTransaction()
               .addToBackStack("mydialogfragment").commit();
Log.v("dialog", "dialog is going down");
}

然后在你的ActivityonResume()中你叫DialogFragment起死回生

@Override
protected void onResume() {
    super.onResume();
    getSupportFragmentManager().popBackStack();
    Log.v("activity", "onresume called - i am bringing back the dialog");
}

我认为这可能有效的原因是 DialogFragmentFragment,并且 Fragment 的生命周期由父 Activity 作为用户 @0mach0 控制图表显示,所以你所做的就是将它推回堆栈并回调它。所以它应该工作