如何确定是否显示任何系统对话框?

时间:2017-05-05 20:52:56

标签: android dialog root

如何检查Android中是否显示任何系统dialog(如下面的那个或USSD)?

airplane mode switching dialog

编程方式还是cmd root方式? 任何变种。

2 个答案:

答案 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,浮动窗口小部件和其他项目。