回答
系統對話框是一個活動。您可以使用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. 如何確定Qt中的對話框是否爲空?
- 5. 如何確定JFace或SWT對話框當前是否打開?
- 6. 在C#.Net中,如何檢測對話框是否顯示?
- 7. 如何檢查是否顯示對話框或顯示同一類型的多個對話框?
- 8. 消息系統,顯示對話列表
- 9. 如何確定Outlook是否有任何聯繫
- 10. 如何顯示「加載...」對話框?
- 11. 如何顯示加載對話框
- 12. 如何顯示報警對話框android
- 13. 如何在asp.net中顯示對話框
- 14. 如何顯示對話框標題
- 15. 如何顯示Windows安全對話框
- 16. 如何在BlackBerry中顯示對話框
- 17. 如何在對話框中顯示UIPickerview
- 18. 如何顯示像stackoverflow對話框?
- 19. 如何創建顯示網絡設置對話框的任務?
- 20. 如何確定是否選中了任何複選框?
- 21. 如何確定「設備」是否需要操作系統
- 22. 如何確定java是否通過python安裝在系統上?
- 23. 如何確定操作系統是否爲C中的POSIX?
- 24. 是否可以更換系統打開文件對話框?
- 25. 如何使用C#在Vista下顯示確認對話框?
- 26. 如何顯示支持bean的確認對話框(Primefaces)
- 27. 如何從下拉列表中顯示確認對話框?
- 28. 如何顯示asp.net中的刪除確認對話框
- 29. SWT文件保存對話框:如何顯示覆蓋確認
- 30. 如何使UI控件在對話框中正確顯示
「系統對話框」只是一個活動,就像任何其他活動一樣。沒有任何魔法使一個活動成爲「系統對話框」,另一個不是「系統對話框」。所以,你首先需要爲自己決定「系統對話」和其他一些以對話爲主題的活動之間的區別特徵。 – CommonsWare
我的意思是類似於關於「飛機模式開啓或關閉」或ussd消息或類似東西的消息... – Andreyua