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

ilw*_*ilw 12 android dialog root

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

飞机模式切换对话框

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

Dav*_*ser 5

理论上你可以使用AccessibilityService,但它相当复杂,并且可能在不同的设备上工作,也可能不工作。用户需要手动为您的应用程序启用辅助功能。每当打开任何窗口时,您都可以从 Android 获取回调,然后您可以询问该窗口以确定它是否包含特定文本或属于特定包等。这是一种“强力”方法,但它可能很有用在某些情况下。


Ped*_*ues 3

系统对话框是一个活动。您可以使用ActivityManager通过顶级活动类名称来检测它。

final ActivityManager manager = (ActivityManager) context
    .getSystemService(Activity.ACTIVITY_SERVICE);
Run Code Online (Sandbox Code Playgroud)

在 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
}
Run Code Online (Sandbox Code Playgroud)

在较新的设备中:

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
}
Run Code Online (Sandbox Code Playgroud)

或者在这种情况下,您可以在开始活动之前检查设备是否处于飞行模式:

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
}
Run Code Online (Sandbox Code Playgroud)