Android設置界面層級為最上層實現

Android設置界面層級為最上層實現

文章目錄

  • Android設置界面層級為最上層實現
    • 一、前言
    • 二、Android設置界面層級為最上層實現
      • 1、主要代碼
      • 2、后遺癥
    • 三、其他
      • 1、Android設置界面層級為最上層小結
      • 2、懸浮框的主要代碼
        • 懸浮框 注意事項
        • (1)權限限制
        • (2)懸浮框窗口類型
        • (3)懸浮框窗口管理
          • Activity添加懸浮框后關閉Activity的情況,沒有Activity,沒有Service,這個應用是存活的,為啥呢?
        • 關鍵窗口類型對比:
        • (4)懸浮框的正常使用
        • (5)查看當前頂層界面信息
        • (6)查看當前所有窗口
      • 3、Android對話框的使用總結
      • 4、Android 幾個簡單的自定義對話框介紹

一、前言

Android設置界面層級為最上層怎么實現?

正常情況設置懸浮框就可以了,懸浮框默認是最上層的。

但是Java還有個地方的代碼可以設置界面再任何界面之上;

具體實現邏輯沒有去分析,這個只是其他人這樣分析實現了,我順便記錄一下。

真正用到的場景估計比較少,有些系統應用的唯一懸浮框界面估計會需要用到;

最后也介紹到了一些懸浮框相關的小眾知識,有興趣的可以看看。

二、Android設置界面層級為最上層實現

1、主要代碼

frameworks\base\services\core\java\com\android\server\wm\Task.java

    @Overridepublic boolean isAlwaysOnTop() {boolean isinstallCts = SystemProperties.getBoolean("persist.skg.isinstall.cts", false);if (!isinstallCts) {// debug settings  return trueString pk = getBasePackageName();if (pk.equals("com.debug.dialog") || pk.equals("com.android.settings") ) {return true;}}return !isForceHidden() && super.isAlwaysOnTop();}

修改上面代碼后就可以實現top的包名應用會出現在最上層;

即使懸浮框和對話框都是顯示在它的下層。

如果兩個應用同時是top,后面拉起的一個會顯示在最上層。

實現原理這里不進行分析了,因為我沒研究過!

2、后遺癥

按照上面的修改會有點問題:

如果只是懸浮框顯示在最上層,并且可以移動,交互上是沒啥問題的;

如果最上層的是Activity 界面,按Home和后臺任務無效,未添加堆棧前返回按鍵無法關閉界面;

因為Home之后的Launcher界面的優先級也比它低;

后臺任務的界面優先級也比它低。

所以只有是懸浮框的應用或特定的系統界面可以采用這種方式設置方式設置界面層級最高級;

其他情況慎用。

三、其他

1、Android設置界面層級為最上層小結

本文是強制設置某個應用的界面為最頂層。一般不建議這樣修改。

簡單的理解每個界面顯示系統都會判斷它的級別,隨后排序顯示顯示。
普通懸浮于應用的場景,使用系統懸浮框就可以了。

大致優先級:top>懸浮框>對話框>Activity.

如果是鎖屏界面呢?在top上面還是下面?

試了一下,鎖屏界面是在top應用界面上面的。鎖屏界面的層級不清楚怎么樣的。

2、懸浮框的主要代碼

// 獲取 WindowManager 服務WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);// 設置 WindowManager 布局參數WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, //懸浮框類別WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,android.graphics.PixelFormat.TRANSLUCENT);//floatingView 是某個layout對象,不能是普通的view,比如TextViewwindowManager.addView(floatingView, params);//移除它
windowManager.removeView(floatingLayout)

floatingView 示例:

//正確示例:
LinearLayout floatingView = (LinearLayout) View.inflate(this, R.layout.activity_main, null);//錯誤示例(傳入這個floatingView會報錯):
LinearLayout floatingView = findViewById(R.id.activity_demo);
懸浮框 注意事項
(1)權限限制

從 Android 6.0 (API 23) 開始,必須通過 Settings.ACTION_MANAGE_OVERLAY_PERMISSION 顯式請求懸浮窗權限。

部分廠商定制系統可能進一步限制此權限。

(2)懸浮框窗口類型
  • Android 8.0 (API 26) 及以上版本必須使用 TYPE_APPLICATION_OVERLAY 類型。

  • 舊版本使用 TYPE_PHONETYPE_SYSTEM_ALERT

  • TYPE_SYSTEM_ALERT 在新版本也能使用,但是必須是系統簽名權限應用。

  • 系統系統應用不常用窗口類別:

    這些類型用于系統組件,普通應用通常無法使用:
    TYPE_STATUS_BAR 描述:狀態欄窗口。
    TYPE_NAVIGATION_BAR 描述:導航欄窗口。
    TYPE_INPUT_METHOD 描述:輸入法窗口。
    TYPE_KEYGUARD 描述:鎖屏界面窗口。
    TYPE_ACCESSIBILITY_OVERLAY 描述:無障礙服務覆蓋窗口。
    TYPE_DREAM 描述:屏保窗口(Doze 模式)。
    TYPE_VOICE_INTERACTION 描述:語音交互窗口(如 Google Assistant)。
    
  • 窗口類型的層級關系(從低到高):

應用界面 < TYPE_APPLICATION_OVERLAY < TYPE_SYSTEM_ALERT < 狀態欄 < 輸入法 < 系統錯誤窗口

上面的窗口類別了解一下就可以了,有些窗口類別是需要再特定條件下才能使用的。

(3)懸浮框窗口管理

WindowManager 添加的懸浮框窗口,后面的窗口不屬于應用了?

如果是demo應用的Activity添加的懸浮框,Activity界面退出后,懸浮框窗口還是會顯示在系統界面上;

那么這個時候demo應用還存活嗎?

使用命令:“ps -ef | grep XXX包名” 查看了一下,應用進程是在的;

即使使用后臺進程列表,去除該應用,發現應用進程還在,懸浮窗口還是存在;

這種情況應該是系統清除進程過程判斷當前應用有關聯的窗口,所以沒有kill應用進程;

使用命令 “ am force-stop XXX包名”,kill進程后,懸浮框確實關閉了。

所以說懸浮框窗口顯示的前提必須要原本拉起懸浮窗口的應用必須存活。

Activity添加懸浮框后關閉Activity的情況,沒有Activity,沒有Service,這個應用是存活的,為啥呢?

這個和系統進程策略有關,有些系統列表的窗口就是可以不依賴Activity存在。

為啥沒有Activity也能存活,具體是哪個類哪個邏輯的處理,我也不清楚!

關鍵窗口類型對比:
窗口類型所屬層級是否允許后臺存在(無 Activity/Service)
TYPE_APPLICATION應用層級不允許:依賴 Activity 存在
TYPE_APPLICATION_OVERLAY應用覆蓋層級允許:可在后臺獨立存在(需權限)
TYPE_SYSTEM_ALERT系統層級允許:系統級窗口,可后臺存在

TYPE_APPLICATION 類別的窗口,和對話框是一樣類型的,不太算懸浮框了。

(4)懸浮框的正常使用

正常情況下,懸浮框的使用都是在Service拉起的,并且可以在Service實時監聽數據變化更新界面顯示。

(5)查看當前頂層界面信息
//普通應用正常運行,查看當前頂層界面信息
console:/ # dumpsys window | grep mFocmFocusedApp=ActivityRecord{3609e53 u0 com.example.an15/.MainActivity t66}mFocusedWindow=Window{4e5b6fa u0 com.example.an15/com.example.an15.MainActivity}
console:/ # 
console:/ # 
//Activity退出,懸浮框界面顯示的時候
console:/ # dumpsys window | grep mFocmFocusedApp=ActivityRecord{85383ad u0 com.android.launcher3/.uioverrides.QuickstepLauncher t63}mFocusedWindow=Window{c1dff8 u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}

可以看到顯示懸浮框界面的時候,當前頂層界面是懸浮框背后的界面,

如果是桌面應用,就是Launcher界面了。

(6)查看當前所有窗口

查看當前所有窗口命令:dumpsys window windows | grep “Window{”

這個命令能看到:當前頂層窗口,懸浮窗口,系統其他窗口信息等。

示例如下:

//*************顯示懸浮窗,并且未關閉demo應用的Activity前
console:/ # 
console:/ # dumpsys window windows | grep "Window{"                            Window #0 Window{6c3345b u0 ScreenDecorOverlayBottom}:...//添加的懸浮窗口信息Window #5 Window{f3d263 u0 Sys2038:com.example.an15/com.example.an15.MainActivity}:Window #6 Window{e3472f4 u0 ShellDropTarget}:Window #7 Window{d2f67df u0 InputMethod}://當前的頂層界面信息,demo應用Window #8 Window{365bc0c u0 com.example.an15/com.example.an15.MainActivity}://其他界面信息,比如Launcher 、后臺未關閉的窗口Window #9 Window{8b073fa u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}:Window #10 Window{c4d9262 u0 com.android.systemui.wallpapers.ImageWallpaper}:
...
console:/ # //***********顯示懸浮窗,并且已關閉demo應用的Activity后,顯示的是Launcher桌面
console:/ # 
console:/ # dumpsys window windows | grep "Window{"                            Window #0 Window{6c3345b u0 ScreenDecorOverlayBottom}://添加的懸浮窗口信息Window #5 Window{f3d263 u0 Sys2038:com.example.an15/com.example.an15.MainActivity}:Window #6 Window{e3472f4 u0 ShellDropTarget}:Window #7 Window{d2f67df u0 InputMethod}://當前的頂層界面信息,Launcher應用Window #8 Window{8b073fa u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}://其他信息界面Window #9 Window{c4d9262 u0 com.android.systemui.wallpapers.ImageWallpaper}:imeLayeringTarget in display# 0 Window{8b073fa u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}imeInputTarget in display# 0 Window{8b073fa u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}
console:/ # 

從window窗口信息,可以大致看到,window的次序信息和界面顯示的是大致一致的;

前面先是顯示懸浮窗口,后面顯示應用窗口;

應用的懸浮窗口信息比較明顯,包含了包名,其他的懸浮窗口,是一些系統的懸浮窗口信息;

懸浮窗口后面的信息,就到普通應用的Activity界面了,

第一個非懸浮窗口界面就是當前的頂層界面,后面的界面就是后臺存在的界面了;

應用界面打開后,按Home返回,所有后臺應用界面都會顯示在上面;

不排除系統判斷當前應用進程太多的情況,會殺死一些應用界面。

以前看這個信息也沒注意這么多,現在看看dumpsys這些window信息對界面分析還是比較有用的。

3、Android對話框的使用總結

(一)警告對話框 AlertDialog: 一個可以有0到3個按鈕, 一個單選框或復選框的列表的對話框. 警告對話框可以創建大多數的交互界面, 是推薦的類型.
(二)進度對話框 ProgressDialog: 顯示一個進度環或者一個進度條. 由于它是AlertDialog的擴展, 所以它也支持按鈕.
(三)日期選擇對話框 DatePickerDialog: 讓用戶選擇一個日期.
(四)時間選擇對話框 TimePickerDialog: 讓用戶選擇一個時間

原文鏈接:https://blog.csdn.net/wenzhi20102321/article/details/52818351

4、Android 幾個簡單的自定義對話框介紹

Android 對話框直接使用肯定是不好看的,如果需要添加取消和確定按鈕,肯定是需要進行自定義修改的。

簡單介紹一個簡單的可擴展的對話框,并且支持不同類型樣式,加了點小動畫。

https://blog.csdn.net/wenzhi20102321/article/details/139040977

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82482.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82482.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82482.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 了解篇

一、GNU 項目與 GPL 許可 &#xff08;一&#xff09;GNU 項目 GNU &#xff1a;GNU 是一個遞歸縮寫&#xff0c;代表 "GNUs Not Unix"。GNU 項目旨在開發一個完全自由的操作系統&#xff0c;該操作系統基于 Unix 的設計理念但不包含 Unix 的代碼。GNU 項目提供了大…

word 如何讓公式居中,公式編號右對齊

問題&#xff1a; 如何讓輸入的公式居中&#xff0c;公式編號右對齊&#xff1f; 解決方法&#xff1a; 方法一&#xff1a;使用制表符 1、輸入內容&#xff1a;先按一次“Tab”鍵&#xff08;制表符&#xff09;&#xff0c;然后鍵入公式&#xff0c;然后再按一次“Tab”鍵…

華為OD機試真題——最小循環子數組 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

OpenCv高階(十七)——dlib庫安裝、dlib人臉檢測

文章目錄 前言一、dlib庫簡介二、dlib庫安裝1、本地安裝&#xff08;離線&#xff09;2、線上安裝 三、dlib人臉檢測原理1、HOG 特征提取2、 SVM 分類器訓練3、 滑動窗口搜索4、非極大值抑制&#xff08;NMS&#xff09; 四、dlib人臉檢測代碼1、導入OpenCV計算機視覺庫和dlib機…

AD-PCB--AD20軟件安裝及中英文切換 DAY 2

1.軟件安裝 1.1 軟件包下載 給你一個捷徑&#xff1a; 1.2 安裝過程&#xff08;安裝過的人跳過就好&#xff0c;一般很多都支持懶人安裝&#xff09; 雙擊其中的exe文件 點擊下一步 選擇中文 接受用戶協議 下面這個彈窗有的沒有。 建議勾選導入導出 安裝目錄&#xff0c…

單向循環鏈表與雙向鏈表

單向循環鏈表的原理與應用 思考&#xff1a;對于單向鏈表而言&#xff0c;想要遍歷鏈表&#xff0c;則必須從鏈表的首結點開始進行遍歷&#xff0c;請問有沒有更簡單的方案實現鏈表中的數據的增刪改查&#xff1f; 回答&#xff1a;是有的&#xff0c;可以使用單向循環的鏈表進…

Windows鼠標掉幀測試與修復

前言 這兩天突然發現鼠標似乎有掉幀&#xff0c;但是掉的又不太明顯&#xff0c;用著感覺似乎快速移動的時候會有一瞬間卡一下&#xff0c;但是眼睛又看不清楚&#xff0c;不太確定是不是自己的心理作用&#xff0c;非常難受。 如何判斷鼠標是否掉幀 根據我的經驗&#xff0…

U 盤數據恢復全攻略

目錄 &#x1f4be; U盤數據誤刪怎么辦&#xff1f;兩款實用工具助你找回丟失文件&#xff01;1?? Recover My Files&#xff1a;數據恢復的得力助手&#x1f4cc; 主要特點&#x1f6e0; 使用步驟詳解1. 下載與安裝2. 啟動軟件并選擇恢復類型3. 選擇U盤所在分區4. 選擇文件恢…

HarmonyOS NEXT~鴻蒙系統運維:全面解析與最佳實踐

HarmonyOS NEXT&#xff5e;鴻蒙系統運維&#xff1a;全面解析與最佳實踐 摘要 本文深入探討鴻蒙(HarmonyOS)系統的運維管理&#xff0c;從架構特點到日常維護操作&#xff0c;全面分析這一全場景分布式操作系統的運維要點。文章將介紹鴻蒙系統特有的分布式能力運維管理、性能…

基于 STM32 的智慧農業溫室控制系統設計與實現

摘要 本文提出一種基于 STM32 微控制器的智慧農業溫室控制系統設計方案,通過集成多類型環境傳感器、執行機構及無線通信模塊,實現對溫室內溫濕度、光照、土壤濕度等參數的實時監測與自動調控。文中詳細闡述硬件選型、電路連接及軟件實現流程,并附關鍵代碼示例,為智慧農業領…

Appium+python自動化(五)- 模擬器

簡介 Appium是做安卓自動化的一個比較流行的工具&#xff0c;對于想要學習該工具但是又局限于沒 android 手機來說&#xff0c;可以通過安卓模擬器來解決該問題&#xff0c;下面就講解使用appium連接安卓模擬器的操作步驟。而是由于手機數據線問題&#xff0c;也只好先用模擬器…

汽車充電樁專用ASCP210系列電氣防火限流式保護器

1.概述汽車充電樁專用電氣防火限流式保護器 電氣防火限流式保護器可有效克服傳統斷路器、空氣開關和監控設備存在的短路電流大、切斷短路電流時間長、短路時產生的電弧火花大&#xff0c;以及使用壽命短等弊端&#xff0c;發生短路故障時&#xff0c;能以微秒級速度快速限制短…

Linux中磁盤分區與掛載

一、磁盤劃分 1.1 了解磁盤 硬盤的接口類型 接口類型發展方向應用場景IDESATA I/II/III個人PC機SCSISAS服務器上 磁盤命名規則 OSIDE(并口)SATA(串口)SCSIRHEL5/dev/hda/dev/sda/dev/sdaRHEL6/dev/sda/dev/sda/dev/sdaRHEL7/dev/sda/dev/sda/dev/sda 1.2 磁盤劃分 磁盤劃…

【數據分析】什么是特征蒸餾?

引言 —— “ 在數據洪流中提煉真金——解密特征蒸餾的藝術。” 在數據爆炸的時代&#xff0c;我們每天產生的信息量已遠超人類處理能力的極限。當企業擁有百萬維的用戶行為數據&#xff0c;醫療研究者面對TB級的基因測序記錄&#xff0c;工程師試圖從千萬張圖像中識別關鍵模式…

機器學習筆記【Week4】

一、 為什么要用神經網絡&#xff1f; 邏輯回歸只能處理線性可分問題。例如&#xff0c;經典的 XOR 異或問題無法用單層邏輯回歸準確分類。神經網絡通過多層結構和非線性激活函數&#xff0c;能學習復雜的決策邊界&#xff0c;解決非線性問題。 二、神經網絡的基本組成 神經網…

java交易所,多語言,外匯,黃金,區塊鏈,dapp類型的,支持授權,劃轉,挖礦(源碼下載)

目前這套主要是運營交易所類型的&#xff0c;授權的會貴點&#xff0c;編譯后的是可以直接跑的&#xff0c;圖片也修復了&#xff0c;后門也掃了 都是在跑的項目支持測&#xff0c;全開源 源碼下載&#xff1a;https://download.csdn.net/download/m0_66047725/90887047 更多…

2025CCPC河北省賽題解

題目區分度不錯&#xff0c;不過兩題手快銅確實沒想到。 Attention is all you need&#xff01; H - What is all you need? 簽到題 #include <bits/stdc.h> #define x first #define y second #define int long long #define double long doubleusing namespace st…

【IOS】【OC】【應用內打印功能的實現】如何在APP內實現打印功能,連接本地打印機,把想要打印的界面打印成圖片

【IOS】【OC】【應用內打印功能的實現】如何在APP內實現打印功能&#xff0c;連接本地打印機&#xff0c;打印想打印的界面 設備/引擎&#xff1a;Mac&#xff08;14.1.1&#xff09;/cocos 開發工具&#xff1a;Xcode 開發語言&#xff1a;OC/C 開發需求&#xff1a;工程中…

AWS WebRTC:獲取信令服務節點和ICE服務節點

建立WebRTC的第一步是獲取信令服務節點和ICE服務節點。 前提條件是有訪問AWS的密鑰&#xff0c;主要是ak&#xff0c;sk&#xff0c;token&#xff0c;我這邊是業務云有接口可以返回這些信息&#xff0c;所以我直接從業務云獲取。 先介紹一下什么是ak&#xff0c;sk&#xff…

C++23 新成員函數與字符串類型的改動

文章目錄 引言std::basic_string::contains 與 std::basic_string_view::contains (P1679R3)功能介紹示例代碼優勢 禁止從 nullptr 構造 std::basic_string 和 std::basic_string_view (P2166R1)背景改動影響 std::basic_string_view 的顯式范圍構造函數 (P1989R2)功能介紹示例…