如何判断当前的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;
}
}
}
}
没有写注释,好学的同学可以断点或者日志调试一下,理解代码的意思。
如果对你有帮助的话,那就动动发财的小手收藏点赞一下吧