<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PhonewindowManager使用詳解

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

一、Android 按鍵修改

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

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

PhoneWindowManager

PhoneWindowManager代碼路徑如下:

alpsframeworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.java
alpsframeworksbasecorejavaandroidviewWindowManagerPolicy.java

二、 PhoneWindowManager 簡介

PhoneWindowManager類實現接口如下:

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

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

PhoneWindowManager 類實現關系

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

三、 如何打開 或者 關閉 Navigation Bar

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

虛擬導航欄

如何打開 或者 關閉 Navigation Bar 的解決方法如下:

1. 修改config.xml 文件中

搜索關鍵字config_showNavigationBar, 查看config_showNavigationBar值
true表示顯示,false表示不顯示

   
    true

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

2. 修改 system.prop 文件

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

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

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

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

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

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

3. 修改PhoneWindowManager代碼

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

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

底部導航卡顯示代碼控制

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

1. 預制Google Now APK

請自行安裝APK

2. 修改 PhoneWindowManager 代碼

長按Home鍵啟動Google Now,實現方法參考launchAssistLongPressAction功能實現。

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

PhoneWindowManager 長按Home 建啟動Google Now

自己實現常按Home鍵吊起Google Now方法,供在按鍵分發處理事件時候調用。

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

自己實現常按Home 鍵吊起Google Now 方法

3. 在按鍵事件分發之前處理

在按鍵分發處理之前調用自定義長按Home鍵的方法

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

自定義長按Home 鍵的方法

4.雙擊Home 鍵調出最近任務列表請用以下方法

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

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

雙擊Home 鍵調出最近任務列表

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

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

1. PhoneStatusBar 里注冊廣播

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

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

自定義廣播實現可以參考系統mDemoReceiver的實現方法
動態注冊廣播方法如下:

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

自定義廣播注冊

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

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

自定義接收廣播處理

2. PhoneWindowManager 中發送廣播

在PhoneWindowManager的interceptKeyBeforeDispatching方法中發送廣播

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

interceptKeyBeforeDispatching 發送廣播

3. Destory 方法注銷廣播

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

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

六、 如何點擊 Menu鍵進入調出最近任務列表

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

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

menu 鍵調出最近任務列表

如果想長按Menu調出可以使用以下方法

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

長按menu 鍵調出任務列表

七、 如何讓 App 拿到Power key 值

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

1. 修改PhoneWindowManager 文件實現

在PhoneWindowManager中修改interceptKeyBeforeQueueing方法實現讓特定的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啟動白屏,黑屏問題)

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

此所謂的閃"黑屏",其實是應用程序的啟動窗口。
啟動窗口出現的條件如下:

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

啟動窗口先于Activity窗口顯示,當Activity窗口的內容準備好之后,啟動窗口就會被移除掉,show出真正的activity窗口

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

正是由于啟動窗口默認是黑色背景的,所以在當前的手機主題為淺色調的時候,就比較容易因為顏色的深淺對比而產生一種視覺上的閃動感。

解決方法如下:

1.去掉啟動窗口

在ActivityStack.java中將SHOW_APP_STARTING_PREVIEW設置為false既可

2. 修改啟動窗口樣式

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

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

修改啟動窗口樣式

九、 WindowManagerPolicy 簡介

PhoneWindowManager 實現 的接口類如下:

alpsframeworksasecorejavaandroidviewWindowManagerPolicy.java

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

WindowManagerPolicy 接口實現

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 接口

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 手機
    +關注

    關注

    34

    文章

    6694

    瀏覽量

    155482
  • Android
    +關注

    關注

    12

    文章

    3880

    瀏覽量

    125858
  • 源碼
    +關注

    關注

    8

    文章

    582

    瀏覽量

    28663
  • 代碼
    +關注

    關注

    30

    文章

    4569

    瀏覽量

    67063

原文標題:九、 WindowManagerPolicy 簡介

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

收藏 人收藏

    評論

    相關推薦

    UCOS詳解

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

    電容應用詳解

    ` 本帖最后由 eehome 于 2013-1-5 09:50 編輯 電容應用詳解`
    發表于 08-16 19:38

    設計詳解.pdf

    電源完整性設計詳解.pdf
    發表于 04-16 20:45

    PCB工藝流程詳解

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

    BERT原理詳解

    BERT原理詳解
    發表于 07-02 16:45

    PWM原理詳解

    PWM原理詳解
    發表于 03-30 19:52

    Protel DXP 實例教程詳解

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

    Modbus_通訊協議詳解

    Modbus_通訊協議詳解,Modbus_通訊協議詳解
    發表于 12-08 14:13 ?0次下載

    GIF文件格式詳解

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

    安信可云詳解

    安信可云詳解
    發表于 03-01 12:47 ?5次下載

    嵌入式詳解

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

    OTT機頂盒H616 android10 電源按鍵開關機

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

    Arduino語法詳解含示例詳解

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

    [源代碼]Python算法詳解

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

    物理設計中的問題詳解

    物理設計中的問題詳解
    的頭像 發表于 07-05 16:56 ?581次閱讀
    物理設計中的問題<b class='flag-5'>詳解</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>