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