android中如何判断activity上面是否有弹窗?

如何判断当前的Activity上面是否有弹窗,比如dialog?

话不多说,编写了一个对应的工具类,附上代码

import android.app.Activity;
import android.os.IBinder;
import android.text.TextUtils;
import android.view.View;
import android.view.WindowManager;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * author : top
 * e-mail : Top_Huang1@human-horizons.com
 * time   : 2024/02/01
 * desc   : This is CheckHasDialogUtil
 * version: 1.0
 */
public class CheckHasDialogUtil {
    public static boolean hasDialogOnActivity(Activity activity) {
        if (activity == null) {
            return false;
        } else {
            try {
                View targetDecorView = activity.getWindow().getDecorView();
                IBinder targetSubToken = targetDecorView.getWindowToken();
                List<View> mViews = getWindowViews("mViews");
                if (mViews == null) {
                    return false;
                } else {
                    int targetIndex = -1;
                    for (int i = 0; i < mViews.size(); ++i) {
                        if (mViews.get(i) == targetDecorView) {
                            targetIndex = i;
                        }
                    }
                    if (targetIndex == -1) {
                        return false;
                    } else {
                        ArrayList<WindowManager.LayoutParams> mParams = getWindowViews("mParams");
                        if (mParams == null) {
                            return false;
                        } else {
                            IBinder targetToken = ((WindowManager.LayoutParams) mParams.get(targetIndex)).token;
                            long size;
                            size = mParams.stream().map((layoutParams) -> {
                                Object[] result = new Object[]{layoutParams.token};
                                return result;
                            }).filter((o) -> {
                                Object[] result = (Object[]) o;
                                IBinder token = result[0] != null ? (IBinder) result[0] : null;
                                boolean ret = (token == targetSubToken || token == targetToken || token == null);
                                return ret;
                            }).count();
                            return size > 1L;
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    }

    public static <T> ArrayList<T> getWindowViews(String param) {
        if (TextUtils.isEmpty(param)) {
            return null;
        } else {
            try {
                Class<?> clz = Class.forName("android.view.WindowManagerGlobal");
                Method mGetInstance = clz.getMethod("getInstance");
                Object instance = mGetInstance.invoke((Object) null);
                Field declaredField = clz.getDeclaredField(param);
                declaredField.setAccessible(true);
                Object objFieldGet = declaredField.get(instance);
                return (ArrayList) objFieldGet;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }
}

没有写注释,好学的同学可以断点或者日志调试一下,理解代码的意思。

如果对你有帮助的话,那就动动发财的小手收藏点赞一下吧

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android开发ActivityAndroid应用程序的基本组件之一,它可以作为弹窗或普通的Activity来使用。 作为弹窗Activity会以对话框的形式显示在屏幕上。我们可以使用Dialog或者AlertDialog等组件创建一个以Activity为基础的弹窗。这种弹窗通常用于显示一些临时性的信息或者获取用户的输入。通过设置Activity的样式和属性,我们可以定制弹窗的外观和行为。弹窗Activity一般不占据整个屏幕,用户可以通过点击外部区域或者按下返回键来关闭弹窗。 而作为普通的Activity,它可以占据整个屏幕,允许用户与之交互。我们可以通过设置Activity的布局文件和相关代码,实现各种用户界面和交互逻辑。普通的Activity通常用于展示复杂的内容,比如列表、详情页面、媒体播放器等。用户可以通过点击按钮、滑动屏幕、触摸事件等与Activity进行交互。 无论Activity是作为弹窗还是普通的界面,它们都有生命周期的概念。当Activity从后台切换到前台时,会依次执行onCreate、onStart和onResume等生命周期方法;当Activity被覆盖或者关闭时,会依次执行onPause、onStop和onDestroy等生命周期方法。这些生命周期方法可以帮助我们管理Activity的状态和资源,以提高应用的性能和用户体验。 总之,通过调整Activity的样式和属性,我们可以将其作为弹窗或者普通的界面使用,并且通过生命周期方法来管理Activity的状态。这使得Android开发具有灵活性和可扩展性,能够满足不同应用场景下的各种需求。 ### 回答2: 在Android开发Activity是一种提供用户界面的基本组件,可以独立运行并具有自己的生命周期。Activity既可以作为弹窗使用,也可以作为普通的全屏Activity来使用。 首先,Activity可以作为弹窗使用。当我们需要在当前界面上显示一个小窗口时,可以创建一个Activity作为弹窗来展示特定的内容或功能。我们只需要在AndroidManifest.xml文件为该Activity设置特定属性(如设置为对话框样式)即可。这样,该Activity将以类似弹窗的形式出现在屏幕上,覆盖部分或全部的父Activity。如此,我们就可以在需要的时候方便地展示或关闭这个弹窗式的Activity,使用户界面更加灵活和丰富。 其次,Activity也可以作为普通的全屏Activity来使用。通过设置Activity的布局文件和相关UI控件,我们可以在全屏幕上展示自定义的界面和功能。这种普通的Activity可以以全屏的形式展示在设备屏幕上,用户可以通过交互与其进行互动。例如,我们可以创建一个用于显示用户信息或实时数据的详情页Activity,用户可以在该界面上进行交互和操作。 综上所述,AndroidActivity既可以作为弹窗使用,也可以作为普通的全屏Activity来使用。它们的使用方式取决于我们的需求和设计。无论是作为弹窗还是全屏,Activity都能够很好地实现我们对界面和功能的定制和展示。 ### 回答3: 在AndroidActivity是应用程序的一部分,用于展示用户界面并处理用户的交互。Activity可以作为弹窗或作为普通的Activity来使用,具体取决于开发者的需求和设计。 首先,作为弹窗使用的Activity通常称为对话框ActivityDialog Activity)。当需要显示一个类似弹窗的界面时,可以使用对话框Activity来实现。对话框Activity的样式通常设置为对话框风格,比如设置背景透明,边框圆角等。对话框Activity可以显示在应用程序的主界面之上,提供用户进行特定操作的场景。例如,在某些情况下,需要提示用户进行确认或提供额外的操作选项,这时可以使用对话框Activity来展示对应的界面。 另一方面,普通的Activity是应用程序常见的一种界面展示方式。它占据整个屏幕,并提供完整的用户交互体验。普通的Activity通常用于主界面、设置界面、列表展示、表单填写等各种场景,在这些界面,用户可以进行复杂的交互操作,包括输入、点击、滑动等。 总之,无论是作为弹窗还是普通的Activity,它们都是Android应用程序负责展示用户界面和处理交互的组件。区别在于对话框Activity主要用于弹窗场景,提供简洁的界面用于特定操作,而普通的Activity则提供完整的界面供用户交互和操作。根据不同的需求和设计,开发者可以灵活地选择使用哪种方式来实现所需的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值