Android 設備按鍵詳解

2021-02-14 程式設計師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層中實現按鍵功能,因此,從手機系統定製的角度,可以滿足客戶的客制化要求。本文主要從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 簡介

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

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 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 分屏多任務模式。
解決方案如下:

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 實現 的接口類如下:

alps\frameworks\base\core\java\android\view\WindowManagerPolicy.java

WindowManagerPolicy 接口實現

WindowManagerPolicy 是一個接口類,主要對外提供一些接口。
常用接口如下:

WindowState 接口

WindowMangerFuncs接口

Screen On 接口

Keyguard 接口

至此,本篇已結束。轉載網絡的文章,小編覺得很優秀,歡迎點擊閱讀原文,支持原創作者,如有侵權,懇請聯繫小編刪除。同時感謝您的閱讀,期待您的關注。

相關焦點

  • Android Q 按鍵添加流程詳解
    二、Framework 層添加按鍵響應方法一、驅動通過GPIO連接的按鍵此類按鍵採用GPIO來連接,通過監測其中斷來判斷按鍵的動作,需要根據具體硬體設計在項目對應的dts文件配置gpio_keys節點。
  • Android平臺View的按鍵事件KeyDown用法
    Android平臺View的按鍵事件KeyDown用法 發表於2011-12-28 13:51| 來源未知| 作者張京晶
  • android布局詳解專題及常見問題 - CSDN
    Android 布局詳解1.重用布局當一個布局文件被多處使用時,最好<include>標籤來重用布局。  <include android:id=」@+id/cell3 layout=」@layout/workspace_screen」 /></LinearLayout>  上面的代碼中的<include>標籤還使用了一個android:id屬性,實際上,該屬性指定的是workspace_screen.xml布局文件中的根節點的android
  • 【Android基礎學習一】Android 常用 adb 命令總結
    >設備的狀態有 3 鍾,device , offline , unknowndevice:設備正常連接offline:連接出現異常,設備無響應unknown:沒有連接設備adb kill-server , adb start-server , 結束 adb 服務, 啟動 adb 服務,通常兩個命令一起用一般在連接出現異常
  • Android測試 常用adb 命令總結
    /commands]$ pwd/Users/xuxu/utils/android/android-sdk-macosx/sources/android-20/com/android/commands[xuxu:...oid-20/com/android/commands]$ ll   total 0drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 amdrwxr-xr-x
  • Android Systrace 基礎知識(5) - SurfaceFlinger 解讀
    設備顯示會按一定速率刷新,在手機和平板電腦上通常為 60 fps。如果顯示內容在刷新期間更新,則會出現撕裂現象;因此,請務必只在周期之間更新內容。在可以安全更新內容時,系統便會收到來自顯示設備的信號。由於歷史原因,我們將該信號稱為 VSYNC 信號。刷新率可能會隨時間而變化,例如,一些行動裝置的幀率範圍在 58 fps 到 62 fps 之間,具體要視當前條件而定。
  • Android壓力測試Monkey工具
    本文引用地址:http://www.eepw.com.cn/article/201610/305869.htm一、 什麼是MonkeyMonkey是Android中的一個命令行工具,可以運行在模擬器裡或實際設備中。它向系統發送偽隨機的用戶事件流(如按鍵輸入、觸控螢幕輸入、手勢輸入等),實現對正在開發的應用程式進行壓力測試。
  • Android相機開發詳解
    尺寸相機作為硬體設備,可以提供兩類尺寸:通過 getSupportedPreviewSizes 方法可以得到支持的預覽幀的尺寸集合。它的值是相機圖像順時針旋轉到設備自然方向一致時的圖像,它可能是 0、90、180、270 四種。對於豎屏應用來說,後置相機傳感器是橫屏安裝的,當你面向屏幕時,如果後置相機傳感器頂邊和設備自然方向的右邊是平行的,那麼後置相機的 orientation 是 90。如果是前置相機傳感器頂邊和設備自然方向的右邊是平行的,則前置相機的 orientation 是 270 。
  • Android架構學習資料
    ~Google官方出品Google官方出品:android-architecture其他的一些文章、Demo、App:文章淺談Andorid開發中的MVP模式  MVP IN ANDROID, PART 1MVP IN ANDROID, PART 2MVP IN ANDROID, PART 3
  • 如何自學Android, 教大家玩爆Android
    這幾個內容的學習可以參考下面幾篇博文: Android中的Menu(菜單)的三種類型菜單的學習 android ListView Android Dialog用法 android Toast大全(這幾個內容可以參考下面幾篇博文: Android HttpClient Android_HttpURLConnection_Get和Post請求 基於android的Socket通信 android WebView總結關於HttpClient,HttpURLConnection部分也可以參考郭霖的《第一行代碼》中的相關部分。
  • android 傳統藍牙開發 (附示例源碼)
    傳統藍牙,自己整理了一下思路,然後寫了一個BluetoothStudy小測試程序,來運用所理解的android傳統藍牙開發技術,寫下一些心得和思路,供其他android熱愛者參考,也方便日後回顧。二、開發詳解1、聲明權限,注意可能需要的運行時權限  <uses-permission android:name="android.permission.BLUETOOTH" />
  • 詳解 Android 是如何啟動的
    分區功能boot系統引導分區,包含著android 內核,系統沒有這個無法啟動。這一部分的鏡像在 boot unlocked 時,也能夠被擦除,但在這個過程中,不能被打斷,關機等等,否者會導致系統無法啟動。
  • 基於PJSIP協議棧和Android的VoIP系統設計方案介紹【詳解】
    Javah生產的頭文件包含一定的規則,例如,本例中,它將生成的函數聲明為「Java_com_android_IMSandroid_pjsip_**」的形式,以便在調用C庫時能正確識別。  由於Java中的數據類型與C/C++不盡相同,因此還必須注意參數傳遞時參數類型的轉換。
  • Android開發必備的「80」個開源庫
    Android Developerhttps://developer.android.google.cn/Android Training 中文版http://hukai.me/android-training-course-in-chinese/index.htmlMaterial Design 中文版http
  • Android單元測試與模擬測試詳解
    模擬測試dependencies {    androidTestCompile 'com.android.support:support-annotations:23.0.1'    androidTestCompile 'com.android.support.test:runner:0.4.1'    androidTestCompile
  • Android Systrace 基礎知識(7) - Vsync 解讀
    [3]Systrace 基礎知識 - SystemServer 解讀[4]Systrace 基礎知識 - SurfaceFlinger 解讀[5]Systrace 基礎知識 - Input 解讀[6]Systrace 基礎知識 - Vsync 解讀[7]Systrace 基礎知識 - Vsync-App :基於 Choreographer 的渲染機制詳解[8]Systrace 基礎知識 - MainThread
  • Android新手入門-Android中文SDK
    container classes, XML utilities, etc)android.os提供基本的操作服務,消息傳遞和進程進程間通訊IPC(provides basic operating system services, message passing, and inter-process communication)android.graphics
  • Android熱修復技術原理詳解(最新最全版本)
    今日限免課程:《Android熱更新技術原理及方案詳解》課程大綱
  • 實況足球2020手柄怎麼操作 北通手柄按鍵功能詳解
    想來很多朋友都還不是很了解吧,所以呢小編今天給大家帶來的就是實況足球2020北通手柄按鍵功能詳解,需要的朋友不妨進來看看。北通手柄按鍵功能詳解 新特性  遊戲性:新的動態盤球技巧、新的第一腳觸球技術和經過精細優化的足球運動軌跡,這些新的特性都是在與中場大師Andrés Iniesta密切合作下開發的。
  • Android之Binder底層原理詳解必讀
    asBinder(){return this;}@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException{switch (code){case INTERFACE_TRANSACTION