和你一起終身學習,這裡是程式設計師Android
經典好文推薦,通過閱讀本文,您將收穫以下知識點:
一、Android 按鍵修改
二、PhoneWindowManager 簡介
三、如何打開 或者 關閉 Navigation Bar
四、如何長按Home 鍵啟動Google Now
五、如何長按實體Menu鍵進入多窗口模式
六、如何點擊 Menu鍵進入調出最近任務列表
七、如何讓 App 拿到Power key 值
八、如何修Activity啟動背景窗口
九、WindowManagerPolicy 簡介
在Android 中會有以下5個按鍵(Back、Home、Menu、Power、Volume)與用戶進行交互,Framework層中實現按鍵功能,因此,從手機系統定製的角度,可以滿足客戶的客制化要求。本文主要從Framework層淺析這些客制化需求的實現。
Back、Home、Menu、Power、Volume 按鍵圖
以MTK 平臺為例,按鍵客制化的代碼主要存放在以下類中
PhoneWindowManager代碼路徑如下:
alps\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
alps\frameworks\base\core\java\android\view\WindowManagerPolicy.java
PhoneWindowManager 類實現接口如下:
java.lang.Object
↳ android.view.WindowManagerPolicy.java
↳ com.android.server.policy.PhoneWindowManager.java
PhoneWindowManager 類實現關係
PhoneWindowManager主要用於實現各種實體或虛擬按鍵處理,如需特殊處理按鍵,請修改源碼。
三、 如何打開 或者 關閉 Navigation Bar虛擬導航欄
如何打開 或者 關閉 Navigation Bar 的解決方法如下:
1. 修改config.xml 文件中搜索關鍵字config_showNavigationBar, 查看 config_showNavigationBar 值
true 表示顯示,false 表示不顯示
<!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
autodetected from the Configuration. -->
<bool name="config_showNavigationBar">true</bool>
參考路徑如下:
alps\frameworks\base\core\res\res\values\config.xml
查詢關鍵字 qemu.hw.mainkeys,並查看值,1表示關閉0.表示開啟 。
# temporary enables NAV bar (soft keys)
qemu.hw.mainkeys=1
不同項目文件存放地址不一樣,可以使用以下命令查找
終端下查找文件方法
find 路徑 -name "文件名.java"
或者直接查找文件中的字符串
find 路徑 -type f -name "文件名" | xargs grep "文件中的字符串"
如果上面兩個修改都不生效(搜索關鍵字config_showNavigationBar、qemu.hw.mainkeys),請在PhoneWindowManager 查看setInitialDisplaySize方法中mHasNavigationBar 的值是否被寫死,true表示會顯示、false表示不顯示導航欄。
底部導航卡顯示代碼控制
四、 如何長按Home 鍵啟動Google Now1. 預製 Google Now APK請自行安裝APK
2. 修改 PhoneWindowManager 代碼長按Home鍵啟動Google Now,實現方法參考launchAssistLongPressAction 功能實現。
PhoneWindowManager 長按Home 建啟動Google Now
自己實現常按Home 鍵吊起Google Now方法,供在按鍵分發處理事件時候調用。
自己實現常按Home 鍵吊起Google Now 方法
3. 在按鍵事件分發之前處理在按鍵分發處理之前調用自定義長按Home鍵的方法
自定義長按Home 鍵的方法
4.雙擊Home 鍵調出最近任務列表請用以下方法在phoneWindowManager.java 的interceptKeyBeforeQueueing 方法中修改
修改方法如下:
雙擊Home 鍵調出最近任務列表
五、 如何長按實體Menu鍵進入多窗口模式Android N上支持Multi-Window,通過recent key進入多窗口,對於沒有打開虛擬導航欄,只有實體menu按鍵的手機,可以考慮向SystemUI發送廣播的形式,進入Android 分屏多任務模式。
解決方案如下:
PhoneStatusBar 是SystemUI模塊的代碼,參考路徑如下:
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
自定義廣播實現可以參考系統mDemoReceiver 的實現方法
動態註冊廣播方法如下:
自定義廣播註冊
自定義接收廣播後,onReceive處理事件實現分屏方法如下:
自定義接收廣播處理
2. PhoneWindowManager 中發送廣播在 PhoneWindowManager的interceptKeyBeforeDispatching方法中發送廣播
interceptKeyBeforeDispatching 發送廣播
3. Destory 方法註銷廣播再Destory方法中記得一定要註銷廣播
mContext.unregisterReceiver(mDemoReceiver);
mContext.unregisterReceiver(mAppLongSwitchReceiver);
如果想調出最近任務列表,需要攔截menu的事件,在PhoneWindowManager的interceptKeyBeforeDispatching 中處理即可
menu 鍵調出最近任務列表
如果想長按Menu調出可以使用以下方法
長按menu 鍵調出任務列表
七、 如何讓 App 拿到Power key 值一般情況下App是拿不到Power的Key值,但通過以下方法可以實現。
1. 修改PhoneWindowManager 文件實現在PhoneWindowManager 中修改interceptKeyBeforeQueueing方法實現讓特定的APP拿到Power key 值
power key 啟動App
2. 如果只想讓某個app的某個Activity 處理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方法中添加自定義樣式或者背景等
修改啟動窗口樣式
九、 WindowManagerPolicy 簡介PhoneWindowManager 實現 的接口類如下:
alps\frameworks\base\core\java\android\view\WindowManagerPolicy.java
WindowManagerPolicy 接口實現
WindowManagerPolicy 是一個接口類,主要對外提供一些接口。
常用接口如下:
WindowState 接口
WindowMangerFuncs接口
Screen On 接口
Keyguard 接口
至此,本篇已結束。轉載網絡的文章,小編覺得很優秀,歡迎點擊閱讀原文,支持原創作者,如有侵權,懇請聯繫小編刪除。同時感謝您的閱讀,期待您的關注。