答案 0 :(得分:2)
系统对话框是一项活动。您可以使用 ActivityManager 。
通过顶级活动类名称检测它final ActivityManager manager = (ActivityManager) context
.getSystemService(Activity.ACTIVITY_SERVICE);
在API级别低于23(M)的设备中:
final List<ActivityManager.RunningTaskInfo> runningTasks = manager.getRunningTasks(1);
final ComponentName componentName = runningTasks.get(0).topActivity;
final String className = componentName.getClassName();
if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) {
// do something
}
在较新的设备中:
final List<ActivityManager.AppTask> appTasks = manager.getAppTasks();
final ComponentName componentName = appTasks.get(0).getTaskInfo().topActivity;
final String className = componentName.getClassName();
if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) {
// do something
}
或者在这种情况下,您可以在开始活动之前检查设备是否处于飞行模式:
private boolean isAirplaneModeOn(final Context context) {
final int airplaneMode = Settings.System.getInt(
context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON,
0
);
return airplaneMode != 0;
}
...
if (!isAirplaneModeOn(this)) {
// do something
}
答案 1 :(得分:2)
您的问题让我想到了Android 6+中权限管理正在使用的解决方案。如果在尝试设置权限时打开Toast或系统警报对话框,您是否见过错误消息? Android "Screen Overlay Detected" message if user is trying to grant a permission when a notification is showing
他们这样做的方法是覆盖dispatchTouchEvent
中的Activity
方法。这可以检查是否有任何“妨碍”触摸事件。您可以将特殊活动用作应用中希望检测其上任何叠加层的任何活动的基类。
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
mObscured = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0;
return super.dispatchTouchEvent(event);
}
如果您的活动被遮挡,请在任何指定时间添加公开方法
public boolean isObscured() {
return mObscured;
}
您应该小心 - 因为从问题中不清楚 - 如果来自系统或特权应用的第二个活动是在堆栈的前面,那么您自己的活动将不再接收触摸事件。这是为了捕获可能共享视图层次结构的片段,Toast,浮动窗口小部件和其他项目。