一、Android 按鍵修改
在Android中會(huì)有以下5個(gè)按鍵(Back、Home、Menu、Power、Volume)與用戶進(jìn)行交互,F(xiàn)ramework層中實(shí)現(xiàn)按鍵功能,因此,從手機(jī)系統(tǒng)定制的角度,可以滿足客戶的客制化要求。本文主要從Framework層淺析這些客制化需求的實(shí)現(xiàn)。
以MTK平臺(tái)為例,按鍵客制化的代碼主要存放在以下類中
PhoneWindowManager
PhoneWindowManager代碼路徑如下:
alpsframeworksbaseservicescorejavacomandroidserverpolicyPhoneWindowManager.java alpsframeworksbasecorejavaandroidviewWindowManagerPolicy.java
二、 PhoneWindowManager 簡(jiǎn)介
PhoneWindowManager類實(shí)現(xiàn)接口如下:
java.lang.Object ? android.view.WindowManagerPolicy.java ? com.android.server.policy.PhoneWindowManager.java
PhoneWindowManager 類實(shí)現(xiàn)關(guān)系
PhoneWindowManager主要用于實(shí)現(xiàn)各種實(shí)體或虛擬按鍵處理,如需特殊處理按鍵,請(qǐng)修改源碼。
三、 如何打開(kāi) 或者 關(guān)閉 Navigation Bar
虛擬導(dǎo)航欄
如何打開(kāi) 或者 關(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.表示開(kāi)啟 。
# temporary enables NAV bar (soft keys) qemu.hw.mainkeys=1
不同項(xiàng)目文件存放地址不一樣,可以使用以下命令查找
終端下查找文件方法
find 路徑 -name "文件名.java"
或者直接查找文件中的字符串
find 路徑 -type f -name "文件名" | xargs grep "文件中的字符串"
3. 修改PhoneWindowManager代碼
如果上面兩個(gè)修改都不生效(搜索關(guān)鍵字config_showNavigationBar、qemu.hw.mainkeys),請(qǐng)?jiān)赑honeWindowManager查看setInitialDisplaySize方法中mHasNavigationBar的值是否被寫(xiě)死,true表示會(huì)顯示、false表示不顯示導(dǎo)航欄。
底部導(dǎo)航卡顯示代碼控制
四、 如何長(zhǎng)按Home 鍵啟動(dòng)Google Now
1. 預(yù)制Google Now APK
請(qǐng)自行安裝APK
2. 修改 PhoneWindowManager 代碼
長(zhǎng)按Home鍵啟動(dòng)Google Now,實(shí)現(xiàn)方法參考launchAssistLongPressAction功能實(shí)現(xiàn)。
PhoneWindowManager 長(zhǎng)按Home 建啟動(dòng)Google Now
自己實(shí)現(xiàn)常按Home鍵吊起Google Now方法,供在按鍵分發(fā)處理事件時(shí)候調(diào)用。
自己實(shí)現(xiàn)常按Home 鍵吊起Google Now 方法
3. 在按鍵事件分發(fā)之前處理
在按鍵分發(fā)處理之前調(diào)用自定義長(zhǎng)按Home鍵的方法
自定義長(zhǎng)按Home 鍵的方法
4.雙擊Home 鍵調(diào)出最近任務(wù)列表請(qǐng)用以下方法
在phoneWindowManager.java的interceptKeyBeforeQueueing方法中修改
修改方法如下:
雙擊Home 鍵調(diào)出最近任務(wù)列表
五、 如何長(zhǎng)按實(shí)體Menu鍵進(jìn)入多窗口模式
Android N上支持Multi-Window,通過(guò)recent key進(jìn)入多窗口,對(duì)于沒(méi)有打開(kāi)虛擬導(dǎo)航欄,只有實(shí)體menu按鍵的手機(jī),可以考慮向SystemUI發(fā)送廣播的形式,進(jìn)入Android分屏多任務(wù)模式。
解決方案如下:
1. PhoneStatusBar 里注冊(cè)廣播
PhoneStatusBar是SystemUI模塊的代碼,參考路徑如下:
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
自定義廣播實(shí)現(xiàn)可以參考系統(tǒng)mDemoReceiver的實(shí)現(xiàn)方法
動(dòng)態(tài)注冊(cè)廣播方法如下:
自定義廣播注冊(cè)
自定義接收廣播后,onReceive處理事件實(shí)現(xiàn)分屏方法如下:
自定義接收廣播處理
2. PhoneWindowManager 中發(fā)送廣播
在PhoneWindowManager的interceptKeyBeforeDispatching方法中發(fā)送廣播
interceptKeyBeforeDispatching 發(fā)送廣播
3. Destory 方法注銷廣播
再Destory方法中記得一定要注銷廣播
mContext.unregisterReceiver(mDemoReceiver); mContext.unregisterReceiver(mAppLongSwitchReceiver);
六、 如何點(diǎn)擊 Menu鍵進(jìn)入調(diào)出最近任務(wù)列表
如果想調(diào)出最近任務(wù)列表,需要攔截menu的事件,在PhoneWindowManager的interceptKeyBeforeDispatching 中處理即可
menu 鍵調(diào)出最近任務(wù)列表
如果想長(zhǎng)按Menu調(diào)出可以使用以下方法
長(zhǎng)按menu 鍵調(diào)出任務(wù)列表
七、 如何讓 App 拿到Power key 值
一般情況下App是拿不到Power的Key值,但通過(guò)以下方法可以實(shí)現(xiàn)。
1. 修改PhoneWindowManager 文件實(shí)現(xiàn)
在PhoneWindowManager中修改interceptKeyBeforeQueueing方法實(shí)現(xiàn)讓特定的APP拿到Power key值
power key 啟動(dòng)App
2. 如果只想讓某個(gè)app的某個(gè)Activity 處理
Power 鍵啟動(dòng)Activity 的方法
八、 如何修Activity啟動(dòng)是的窗口(app啟動(dòng)白屏,黑屏問(wèn)題)
當(dāng)用戶從主菜單進(jìn)入其他應(yīng)用程序例如時(shí)鐘、聯(lián)系人、文件管理等時(shí),可能會(huì)出現(xiàn)屏幕閃一下黑屏、白屏等問(wèn)題,這種現(xiàn)象在當(dāng)前手機(jī)主題(Theme)是淺色(例如白色)的情況下比較明顯。
此所謂的閃"黑屏",其實(shí)是應(yīng)用程序的啟動(dòng)窗口。
啟動(dòng)窗口出現(xiàn)的條件如下:
僅在要啟動(dòng)的Activity在新的Task或者新的Process時(shí),才可能顯示啟動(dòng)窗口
啟動(dòng)窗口先于Activity窗口顯示,當(dāng)Activity窗口的內(nèi)容準(zhǔn)備好之后,啟動(dòng)窗口就會(huì)被移除掉,show出真正的activity窗口
啟動(dòng)窗口和普通的Activity window類似,只是沒(méi)有畫(huà)任何內(nèi)容,默認(rèn)是一個(gè)黑色背景的窗口
正是由于啟動(dòng)窗口默認(rèn)是黑色背景的,所以在當(dāng)前的手機(jī)主題為淺色調(diào)的時(shí)候,就比較容易因?yàn)轭伾纳顪\對(duì)比而產(chǎn)生一種視覺(jué)上的閃動(dòng)感。
解決方法如下:
1.去掉啟動(dòng)窗口
在ActivityStack.java中將SHOW_APP_STARTING_PREVIEW設(shè)置為false既可
2. 修改啟動(dòng)窗口樣式
在PhoneWindowManager中的addStartingWindow方法中添加自定義樣式或者背景等
修改啟動(dòng)窗口樣式
九、 WindowManagerPolicy 簡(jiǎn)介
PhoneWindowManager 實(shí)現(xiàn) 的接口類如下:
alpsframeworksasecorejavaandroidviewWindowManagerPolicy.java
WindowManagerPolicy 接口實(shí)現(xiàn)
WindowManagerPolicy 是一個(gè)接口類,主要對(duì)外提供一些接口。
常用接口如下:
WindowState 接口
WindowMangerFuncs接口
Screen On 接口
Keyguard 接口
審核編輯:湯梓紅
-
手機(jī)
+關(guān)注
關(guān)注
35文章
6914瀏覽量
158588 -
Android
+關(guān)注
關(guān)注
12文章
3946瀏覽量
128176 -
源碼
+關(guān)注
關(guān)注
8文章
654瀏覽量
29616 -
代碼
+關(guān)注
關(guān)注
30文章
4846瀏覽量
69279
原文標(biāo)題:九、 WindowManagerPolicy 簡(jiǎn)介
文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Protel DXP 實(shí)例教程詳解
OTT機(jī)頂盒H616 android10 電源按鍵開(kāi)關(guān)機(jī)

評(píng)論