回答
系统对话框是一个活动。您可以使用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
}
理论上你可以使用AccessibilityService
来做到这一点,但它很复杂,可能会或可能不会在不同的设备上工作。用户需要为应用程序手动启用辅助功能。您可以在任何窗口打开时从Android获取回调,然后可以询问窗口以确定它是否包含特定文本或属于特定包等。这是一种“暴力”方法,但它可能很有用在某些情况下。
类似的东西http://stackoverflow.com/a/32251469/3478155? – Andreyua
您的问题让我想到了Android 6+中的权限管理所使用的解决方案。尝试设置权限时,如果Toast或系统警报对话框打开,您是否曾见过错误消息? Android "Screen Overlay Detected" message if user is trying to grant a permission when a notification is showing
他们这样做的方式是通过覆盖Activity
中的dispatchTouchEvent
方法。这可以检查是否有任何东西在拦截触摸事件。您可以将您的特殊活动作为您应用中任何想要检测任何叠加层的活动的基类。
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
mObscured = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0;
return super.dispatchTouchEvent(event);
}
添加一个公共的方法来检查,在任何给定的时间,如果你的活动被遮挡
public boolean isObscured() {
return mObscured;
}
你应该要小心 - 因为它不是从问题明确 - 如果从系统的第二活动或特权应用程序位于堆栈的前端,那么您自己的活动将不再接收触摸事件。这是为了捕获可能共享视图层次的碎片,吐司,浮动小部件和其他项目。
不幸的是,不要在kitkat上工作 – Andreyua
- 1. 在确认对话框中显示是/否而非确定
- 2. 如何显示对话框
- 3. 如何使自定义警报对话框正确显示
- 4. 如何确定JFace或SWT对话框当前是否打开?
- 5. 如何确定一个元素是否配置了对话框?
- 6. 如何确定Qt中的对话框是否为空?
- 7. 在C#.Net中,如何检测对话框是否显示?
- 8. 检测是否字体系列变化和显示对话框
- 9. 如何检查是否显示对话框或显示同一类型的多个对话框?
- 10. 消息系统,显示对话列表
- 11. 显示自定义对话框而不是“ANR对话框”
- 12. 确认后显示确认对话框
- 13. 如何确定Outlook是否有任何联系
- 14. 如何在Android中显示对话框中的对话框?
- 15. 如何确定(在AS3中)系统光标是隐藏还是显示?
- 16. 安卓系统 - 远程服务 - 无法显示对话框
- 17. 如何只显示对话框一次
- 18. 如何显示打印对话框
- 19. 如何阻止Umbraco显示对话框?
- 20. 如何显示加载对话框
- 21. 如何显示Windows登录对话框?
- 22. 如何在BlackBerry中显示对话框
- 23. 如何在asp.net中显示对话框
- 24. 如何显示对话框标题
- 25. 如何显示对话框支持bean?
- 26. 如何显示“加载...”对话框?
- 27. 如何显示Windows安全对话框
- 28. 如何显示报警对话框android
- 29. 如何显示像stackoverflow对话框?
- 30. 如何在对话框中显示UIPickerview
“系统对话框”只是一个活动,就像任何其他活动一样。没有任何魔法使一个活动成为“系统对话框”,另一个不是“系统对话框”。所以,你首先需要为自己决定“系统对话”和其他一些以对话为主题的活动之间的区别特征。 – CommonsWare
我的意思是类似于关于“飞机模式开启或关闭”或ussd消息或类似东西的消息... – Andreyua