那曲檬骨新材料有限公司

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

審核編輯:湯梓紅

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

    關注

    35

    文章

    6899

    瀏覽量

    158276
  • Android
    +關注

    關注

    12

    文章

    3945

    瀏覽量

    127947
  • 源碼
    +關注

    關注

    8

    文章

    652

    瀏覽量

    29458
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69058

原文標題:九、 WindowManagerPolicy 簡介

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

收藏 人收藏

    評論

    相關推薦

    UCOS詳解

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

    設計詳解.pdf

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

    PCB工藝流程詳解

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

    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次下載

    ethercat通訊模塊詳解

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

    Hex的格式詳解

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

    Prelink的交叉編譯和使用詳解

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

    嵌入式詳解

    嵌入式詳解(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 ?1052次閱讀
    物理設計中的問題<b class='flag-5'>詳解</b>
    百家乐视频裸聊| 百家乐官网智能分析| 百家乐官网推饼| 澳门百家乐官网娱乐城信誉如何 | 云顶平台| 先锋百家乐的玩法技巧和规则| 筹码百家乐的玩法技巧和规则| 百家乐游戏什么时间容易出对| 网络百家乐官网路子玩| 百家乐体育nba| 百家乐翻天粤语| 汇丰百家乐官网的玩法技巧和规则| 百家乐看炉子的方法| 百家乐招商用语| 百家乐玩法说明| 新全讯网网址g5vvv| 皇冠网小说网址| 百家乐官网明灯| 美高梅百家乐娱乐城| 大发888官网df888| 百家乐官网赌场老千| 百家乐官网平玩法几副牌| 免水百家乐的玩法技巧和规则| 水果机赌博| 百家乐平台信誉排名| tt娱乐城clega| 百家乐官网软件购买| 风水8闰24山| 大发888娱乐场 zb8| 百家乐官网真人游戏攻略| 恒丰百家乐的玩法技巧和规则 | 百家乐庄家出千内幕| 百家乐怎样玩才会赢钱| 百家乐官网对保| sp全讯网新2| 百家乐官网五星宏辉怎么玩| 财神百家乐官网的玩法技巧和规则 | 百家乐试玩全讯网2| 百家乐官网投注网站| 威尼斯人娱乐城活动| 百家乐官网最低压多少|