0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PhonewindowManager使用詳解

哆啦安全 ? 來源:程序員Android ? 2023-11-08 09:48 ? 次閱讀

一、Android 按鍵修改

在Android中會有以下5個按鍵(Back、Home、Menu、Power、Volume)與用戶進行交互,F(xiàn)ramework層中實現(xiàn)按鍵功能,因此,從手機系統(tǒng)定制的角度,可以滿足客戶的客制化要求。本文主要從Framework層淺析這些客制化需求的實現(xiàn)。

以MTK平臺為例,按鍵客制化的代碼主要存放在以下類中

PhoneWindowManager

PhoneWindowManager代碼路徑如下:

alpsframeworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.java
alpsframeworksbasecorejavaandroidviewWindowManagerPolicy.java

二、 PhoneWindowManager 簡介

PhoneWindowManager類實現(xiàn)接口如下:

java.lang.Object
    ?  android.view.WindowManagerPolicy.java
         ? com.android.server.policy.PhoneWindowManager.java

fd3744a4-7dce-11ee-939d-92fbcf53809c.jpg

PhoneWindowManager 類實現(xiàn)關(guān)系

PhoneWindowManager主要用于實現(xiàn)各種實體或虛擬按鍵處理,如需特殊處理按鍵,請修改源碼。

三、 如何打開 或者 關(guān)閉 Navigation Bar

fd47c2d4-7dce-11ee-939d-92fbcf53809c.jpg

虛擬導(dǎo)航欄

如何打開 或者 關(guān)閉 Navigation Bar 的解決方法如下:

1. 修改config.xml 文件中

搜索關(guān)鍵字config_showNavigationBar, 查看config_showNavigationBar值
true表示顯示,false表示不顯示

   
    true

參考路徑如下:
alpsframeworksasecore es esvaluesconfig.xml

2. 修改 system.prop 文件

查詢關(guān)鍵字qemu.hw.mainkeys,并查看值,1表示關(guān)閉0.表示開啟 。

# temporary enables NAV bar (soft keys)
qemu.hw.mainkeys=1

不同項目文件存放地址不一樣,可以使用以下命令查找
終端下查找文件方法

find 路徑 -name "文件名.java"

或者直接查找文件中的字符串

 find 路徑 -type f -name "文件名" | xargs grep "文件中的字符串"

3. 修改PhoneWindowManager代碼

如果上面兩個修改都不生效(搜索關(guān)鍵字config_showNavigationBar、qemu.hw.mainkeys),請在PhoneWindowManager查看setInitialDisplaySize方法中mHasNavigationBar的值是否被寫死,true表示會顯示、false表示不顯示導(dǎo)航欄。

fd63ed42-7dce-11ee-939d-92fbcf53809c.jpg

底部導(dǎo)航卡顯示代碼控制

四、 如何長按Home 鍵啟動Google Now

1. 預(yù)制Google Now APK

請自行安裝APK

2. 修改 PhoneWindowManager 代碼

長按Home鍵啟動Google Now,實現(xiàn)方法參考launchAssistLongPressAction功能實現(xiàn)。

fd6e68f8-7dce-11ee-939d-92fbcf53809c.jpg

PhoneWindowManager 長按Home 建啟動Google Now

自己實現(xiàn)常按Home鍵吊起Google Now方法,供在按鍵分發(fā)處理事件時候調(diào)用。

fd9253e4-7dce-11ee-939d-92fbcf53809c.jpg

自己實現(xiàn)常按Home 鍵吊起Google Now 方法

3. 在按鍵事件分發(fā)之前處理

在按鍵分發(fā)處理之前調(diào)用自定義長按Home鍵的方法

fdb63e94-7dce-11ee-939d-92fbcf53809c.jpg

自定義長按Home 鍵的方法

4.雙擊Home 鍵調(diào)出最近任務(wù)列表請用以下方法

在phoneWindowManager.java的interceptKeyBeforeQueueing方法中修改
修改方法如下:

fdd656e8-7dce-11ee-939d-92fbcf53809c.jpg

雙擊Home 鍵調(diào)出最近任務(wù)列表

五、 如何長按實體Menu鍵進入多窗口模式

Android N上支持Multi-Window,通過recent key進入多窗口,對于沒有打開虛擬導(dǎo)航欄,只有實體menu按鍵的手機,可以考慮向SystemUI發(fā)送廣播的形式,進入Android分屏多任務(wù)模式。
解決方案如下:

1. PhoneStatusBar 里注冊廣播

PhoneStatusBar是SystemUI模塊的代碼,參考路徑如下:

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

自定義廣播實現(xiàn)可以參考系統(tǒng)mDemoReceiver的實現(xiàn)方法
動態(tài)注冊廣播方法如下:

fdea2c7c-7dce-11ee-939d-92fbcf53809c.jpg

自定義廣播注冊

自定義接收廣播后,onReceive處理事件實現(xiàn)分屏方法如下:

fe07a310-7dce-11ee-939d-92fbcf53809c.jpg

自定義接收廣播處理

2. PhoneWindowManager 中發(fā)送廣播

在PhoneWindowManager的interceptKeyBeforeDispatching方法中發(fā)送廣播

fe1296f8-7dce-11ee-939d-92fbcf53809c.jpg

interceptKeyBeforeDispatching 發(fā)送廣播

3. Destory 方法注銷廣播

再Destory方法中記得一定要注銷廣播

 mContext.unregisterReceiver(mDemoReceiver);
 mContext.unregisterReceiver(mAppLongSwitchReceiver);

六、 如何點擊 Menu鍵進入調(diào)出最近任務(wù)列表

如果想調(diào)出最近任務(wù)列表,需要攔截menu的事件,在PhoneWindowManager的interceptKeyBeforeDispatching 中處理即可

fe2b9d88-7dce-11ee-939d-92fbcf53809c.jpg

menu 鍵調(diào)出最近任務(wù)列表

如果想長按Menu調(diào)出可以使用以下方法

fe4c582a-7dce-11ee-939d-92fbcf53809c.jpg

長按menu 鍵調(diào)出任務(wù)列表

七、 如何讓 App 拿到Power key 值

一般情況下App是拿不到Power的Key值,但通過以下方法可以實現(xiàn)。

1. 修改PhoneWindowManager 文件實現(xiàn)

在PhoneWindowManager中修改interceptKeyBeforeQueueing方法實現(xiàn)讓特定的APP拿到Power key值

fe720e08-7dce-11ee-939d-92fbcf53809c.jpg

power key 啟動App

2. 如果只想讓某個app的某個Activity 處理

fe7f1530-7dce-11ee-939d-92fbcf53809c.jpg

Power 鍵啟動Activity 的方法

八、 如何修Activity啟動是的窗口(app啟動白屏,黑屏問題)

當(dāng)用戶從主菜單進入其他應(yīng)用程序例如時鐘、聯(lián)系人、文件管理等時,可能會出現(xiàn)屏幕閃一下黑屏、白屏等問題,這種現(xiàn)象在當(dāng)前手機主題(Theme)是淺色(例如白色)的情況下比較明顯。

此所謂的閃"黑屏",其實是應(yīng)用程序的啟動窗口。
啟動窗口出現(xiàn)的條件如下:

僅在要啟動的Activity在新的Task或者新的Process時,才可能顯示啟動窗口

啟動窗口先于Activity窗口顯示,當(dāng)Activity窗口的內(nèi)容準(zhǔn)備好之后,啟動窗口就會被移除掉,show出真正的activity窗口

啟動窗口和普通的Activity window類似,只是沒有畫任何內(nèi)容,默認(rèn)是一個黑色背景的窗口

正是由于啟動窗口默認(rèn)是黑色背景的,所以在當(dāng)前的手機主題為淺色調(diào)的時候,就比較容易因為顏色的深淺對比而產(chǎn)生一種視覺上的閃動感。

解決方法如下:

1.去掉啟動窗口

在ActivityStack.java中將SHOW_APP_STARTING_PREVIEW設(shè)置為false既可

2. 修改啟動窗口樣式

在PhoneWindowManager中的addStartingWindow方法中添加自定義樣式或者背景等

fea021da-7dce-11ee-939d-92fbcf53809c.jpg

修改啟動窗口樣式

九、 WindowManagerPolicy 簡介

PhoneWindowManager 實現(xiàn) 的接口類如下:

alpsframeworksasecorejavaandroidviewWindowManagerPolicy.java

feab1fe0-7dce-11ee-939d-92fbcf53809c.jpg

WindowManagerPolicy 接口實現(xiàn)

WindowManagerPolicy 是一個接口類,主要對外提供一些接口。
常用接口如下:

fed24e08-7dce-11ee-939d-92fbcf53809c.jpg

WindowState 接口

fef3e9e6-7dce-11ee-939d-92fbcf53809c.jpg

WindowMangerFuncs接口

ff18c248-7dce-11ee-939d-92fbcf53809c.jpg

Screen On 接口

ff2abe62-7dce-11ee-939d-92fbcf53809c.jpg

Keyguard 接口

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 手機
    +關(guān)注

    關(guān)注

    35

    文章

    6844

    瀏覽量

    157329
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3917

    瀏覽量

    127061
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    632

    瀏覽量

    29116
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4728

    瀏覽量

    68248

原文標(biāo)題:九、 WindowManagerPolicy 簡介

文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    UCOS詳解

    UCOS詳解!對初者來說還是不錯的!
    發(fā)表于 08-24 16:27

    PCB工藝流程詳解

    PCB工藝流程詳解PCB工藝流程詳解
    發(fā)表于 05-22 14:46

    PWM原理詳解

    PWM原理詳解
    發(fā)表于 03-30 19:52

    Protel DXP 實例教程詳解

    Protel DXP 實例教程詳解Protel DXP 實例教程詳解下載介紹:Protel DXP 多媒體實例教程詳解
    發(fā)表于 03-12 02:12 ?0次下載

    負反饋和負載的問題詳解

    負反饋和負載的問題詳解
    發(fā)表于 11-25 11:33 ?3次下載

    Modbus_通訊協(xié)議詳解

    Modbus_通訊協(xié)議詳解,Modbus_通訊協(xié)議詳解
    發(fā)表于 12-08 14:13 ?0次下載

    GIF文件格式詳解

    GIF文件格式詳解 GIF文件格式詳解 GIF文件格式詳解
    發(fā)表于 05-24 10:53 ?2次下載

    ethercat通訊模塊詳解

    ethercat通訊模塊詳解
    發(fā)表于 09-09 08:11 ?57次下載

    Hex的格式詳解

    Hex的格式詳解
    發(fā)表于 10-31 14:46 ?10次下載
    Hex的格式<b class='flag-5'>詳解</b>

    Prelink的交叉編譯和使用詳解

    Prelink的交叉編譯和使用詳解
    的頭像 發(fā)表于 06-20 12:03 ?3488次閱讀
    Prelink的交叉編譯和使用<b class='flag-5'>詳解</b>

    嵌入式詳解

    嵌入式詳解(stm32嵌入式開發(fā)實例)-嵌入式詳解,有需要的可以參考!
    發(fā)表于 07-30 16:07 ?64次下載
    嵌入式<b class='flag-5'>詳解</b>

    OTT機頂盒H616 android10 電源按鍵開關(guān)機

    diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core
    發(fā)表于 01-10 14:53 ?2次下載
    OTT機頂盒H616 android10 電源按鍵開關(guān)機

    Arduino語法詳解含示例詳解

    Arduino語法詳解_含示例詳解
    發(fā)表于 07-19 14:09 ?6次下載

    [源代碼]Python算法詳解

    [源代碼]Python算法詳解[源代碼]Python算法詳解
    發(fā)表于 06-06 17:50 ?0次下載

    物理設(shè)計中的問題詳解

    物理設(shè)計中的問題詳解
    的頭像 發(fā)表于 07-05 16:56 ?885次閱讀
    物理設(shè)計中的問題<b class='flag-5'>詳解</b>