Android 設備按鍵詳解

和你一起終身學習,這里是程序員Android
經典好文推薦,通過閱讀本文,您將收獲以下知識點:
一、Android 按鍵修改
二、PhoneWindowManager 簡介
三、如何打開 或者 關閉 Navigation Bar
四、如何長按Home 鍵啟動Google Now
五、如何長按實體Menu鍵進入多窗口模式
六、如何點擊 Menu鍵進入調出最近任務列表
七、如何讓 App 拿到Power key 值
八、如何修Activity啟動背景窗口
九、WindowManagerPolicy 簡介
一、Android 按鍵修改
在Android 中會有以下5個按鍵(Back、Home、Menu、Power、Volume)與用戶進行交互,Framework層中實現(xiàn)按鍵功能,因此,從手機系統(tǒng)定制的角度,可以滿足客戶的客制化要求。本文主要從Framework層淺析這些客制化需求的實現(xiàn)。

Back、Home、Menu、Power、Volume 按鍵圖
以MTK 平臺為例,按鍵客制化的代碼主要存放在以下類中
1.PhoneWindowManager
PhoneWindowManager代碼路徑如下:
alps\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
alps\frameworks\base\core\java\android\view\WindowManagerPolicy.java
二、 PhoneWindowManager 簡介
PhoneWindowManager 類實現(xiàn)接口如下:
java.lang.Object
? android.view.WindowManagerPolicy.java
? com.android.server.policy.PhoneWindowManager.java

PhoneWindowManager 類實現(xiàn)關系
PhoneWindowManager主要用于實現(xiàn)各種實體或虛擬按鍵處理,如需特殊處理按鍵,請修改源碼。
三、 如何打開 或者 關閉 Navigation Bar

虛擬導航欄
如何打開 或者 關閉 Navigation Bar 的解決方法如下:
1. 修改config.xml 文件中
搜索關鍵字config_showNavigationBar, 查看 config_showNavigationBar 值true 表示顯示,false 表示不顯示
<bool name="config_showNavigationBar">truebool>
參考路徑如下:alps\frameworks\base\core\res\res\values\config.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表示不顯示導航欄。

底部導航卡顯示代碼控制
四、 如何長按Home 鍵啟動Google Now
1. 預制 Google Now APK
請自行安裝APK
2. 修改 PhoneWindowManager 代碼
長按Home鍵啟動Google Now,實現(xiàn)方法參考launchAssistLongPressAction 功能實現(xiàn)。

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

自己實現(xiàn)常按Home 鍵吊起Google Now 方法
3. 在按鍵事件分發(fā)之前處理
在按鍵分發(fā)處理之前調用自定義長按Home鍵的方法

自定義長按Home 鍵的方法
4.雙擊Home 鍵調出最近任務列表請用以下方法
在phoneWindowManager.java 的interceptKeyBeforeQueueing 方法中修改
修改方法如下:

雙擊Home 鍵調出最近任務列表
五、 如何長按實體Menu鍵進入多窗口模式
Android N上支持Multi-Window,通過recent key進入多窗口,對于沒有打開虛擬導航欄,只有實體menu按鍵的手機,可以考慮向SystemUI發(fā)送廣播的形式,進入Android 分屏多任務模式。
解決方案如下:
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)注冊廣播方法如下:

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

自定義接收廣播處理
2. PhoneWindowManager 中發(fā)送廣播
在 PhoneWindowManager的interceptKeyBeforeDispatching方法中發(fā)送廣播

interceptKeyBeforeDispatching 發(fā)送廣播
3. Destory 方法注銷廣播
再Destory方法中記得一定要注銷廣播
mContext.unregisterReceiver(mDemoReceiver);
mContext.unregisterReceiver(mAppLongSwitchReceiver);
六、 如何點擊 Menu鍵進入調出最近任務列表
如果想調出最近任務列表,需要攔截menu的事件,在PhoneWindowManager的interceptKeyBeforeDispatching 中處理即可

menu 鍵調出最近任務列表
如果想長按Menu調出可以使用以下方法

長按menu 鍵調出任務列表
七、 如何讓 App 拿到Power key 值
一般情況下App是拿不到Power的Key值,但通過以下方法可以實現(xiàn)。
1. 修改PhoneWindowManager 文件實現(xiàn)
在PhoneWindowManager 中修改interceptKeyBeforeQueueing方法實現(xiàn)讓特定的APP拿到Power key 值

power key 啟動App
2. 如果只想讓某個app的某個Activity 處理

Power 鍵啟動Activity 的方法
八、 如何修Activity啟動是的窗口(app啟動白屏,黑屏問題)
當用戶從主菜單進入其他應用程序例如時鐘、聯(lián)系人、文件管理等時,可能會出現(xiàn)屏幕閃一下黑屏、白屏等問題,這種現(xiàn)象在當前手機主題(Theme)是淺色(例如白色)的情況下比較明顯。
此所謂的閃"黑屏",其實是應用程序的啟動窗口。
啟動窗口出現(xiàn)的條件如下:
僅在要啟動的
Activity在新的Task或者新的Process時,才可能顯示啟動窗口啟動窗口先于
Activity窗口顯示,當Activity窗口的內容準備好之后,啟動窗口就會被移除掉,show出真正的activity窗口啟動窗口和普通的
Activity window類似,只是沒有畫任何內容,默認是一個黑色背景的窗口
正是由于啟動窗口默認是黑色背景的,所以在當前的手機主題為淺色調的時候,就比較容易因為顏色的深淺對比而產生一種視覺上的閃動感。
解決方法如下:
1.去掉啟動窗口
在 ActivityStack.java中將SHOW_APP_STARTING_PREVIEW設置為false既可
2. 修改啟動窗口樣式
在 PhoneWindowManager中的addStartingWindow方法中添加自定義樣式或者背景等

修改啟動窗口樣式
九、 WindowManagerPolicy 簡介
PhoneWindowManager 實現(xiàn) 的接口類如下:
alps\frameworks\base\core\java\android\view\WindowManagerPolicy.java

WindowManagerPolicy 接口實現(xiàn)
WindowManagerPolicy 是一個接口類,主要對外提供一些接口。
常用接口如下:

WindowState 接口

WindowMangerFuncs接口

Screen On 接口

Keyguard 接口
至此,本篇已結束。轉載網絡的文章,小編覺得很優(yōu)秀,歡迎點擊閱讀原文,支持原創(chuàng)作者,如有侵權,懇請聯(lián)系小編刪除。同時感謝您的閱讀,期待您的關注。
