一、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
PhoneWindowManager 類實現關系
PhoneWindowManager主要用于實現各種實體或虛擬按鍵處理,如需特殊處理按鍵,請修改源碼。
三、 如何打開 或者 關閉 Navigation Bar
虛擬導航欄
如何打開 或者 關閉 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表示不顯示導航欄。
底部導航卡顯示代碼控制
四、 如何長按Home 鍵啟動Google Now
1. 預制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分屏多任務模式。
解決方案如下:
1. PhoneStatusBar 里注冊廣播
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鍵進入調出最近任務列表
如果想調出最近任務列表,需要攔截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 實現 的接口類如下:
alpsframeworksasecorejavaandroidviewWindowManagerPolicy.java
WindowManagerPolicy 接口實現
WindowManagerPolicy 是一個接口類,主要對外提供一些接口。
常用接口如下:
WindowState 接口
WindowMangerFuncs接口
Screen On 接口
Keyguard 接口
審核編輯:湯梓紅
-
手機
+關注
關注
35文章
6896瀏覽量
158053 -
Android
+關注
關注
12文章
3943瀏覽量
127765 -
源碼
+關注
關注
8文章
652瀏覽量
29400 -
代碼
+關注
關注
30文章
4823瀏覽量
68920
原文標題:九、 WindowManagerPolicy 簡介
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論