Android 判断 Activity 上是否有 Dialog

在 Android 开发中,我们经常需要判断一个 Activity 上是否显示了 Dialog。这在很多场景下都非常有用,比如在用户点击某个按钮时,如果当前 Activity 上已经显示了一个 Dialog,我们可能不希望再次弹出新的 Dialog,以免造成用户体验不佳。

旅行图

首先,我们通过一个旅行图来描述判断 Activity 上是否有 Dialog 的流程:

journey
    title 判断 Activity 上是否有 Dialog
    section 步骤1: 获取当前 Activity
    section 步骤2: 获取当前 Activity 的 Window
    section 步骤3: 获取 Window 的 DecorView
    section 步骤4: 检查 DecorView 的子视图
    section 步骤5: 判断是否有 Dialog

代码示例

接下来,我们通过一段代码来实现这个功能。以下是一个简单的示例,展示如何判断 Activity 上是否有 Dialog。

public class DialogUtils {

    public static boolean isDialogShowing(Activity activity) {
        if (activity == null || activity.isFinishing()) {
            return false;
        }

        Window window = activity.getWindow();
        if (window == null) {
            return false;
        }

        View decorView = window.peekDecorView();
        if (decorView == null) {
            return false;
        }

        for (int i = 0; i < decorView.getChildCount(); i++) {
            View child = decorView.getChildAt(i);
            if (child instanceof Dialog) {
                return true;
            }
        }

        return false;
    }
}

甘特图

为了更直观地展示判断 Activity 上是否有 Dialog 的过程,我们可以使用甘特图来表示:

gantt
    title 判断 Activity 上是否有 Dialog 的过程
    dateFormat  YYYY-MM-DD
    section 获取当前 Activity
    获取当前 Activity :done, des1, 2022-01-01,2022-01-02
    section 获取当前 Activity 的 Window
    获取 Window :after des1, 2022-01-03,2022-01-04
    section 获取 Window 的 DecorView
    获取 DecorView :after des2, 2022-01-05,2022-01-06
    section 检查 DecorView 的子视图
    检查子视图 :after des3, 2022-01-07,2022-01-08
    section 判断是否有 Dialog
    判断 Dialog :after des4, 2022-01-09,2022-01-10

结尾

通过上述的代码示例和旅行图、甘特图的展示,我们可以清晰地了解如何在 Android 中判断一个 Activity 上是否显示了 Dialog。这个功能在很多实际开发场景中都非常有用,比如在用户交互、多任务处理等方面。希望这篇文章能够帮助到大家,如果有任何问题,欢迎随时交流和讨论。