Android O實(shí)現(xiàn)Framework層CENTER鍵長(zhǎng)按功能方法
需求
設(shè)備有一個(gè)按鍵,我們定義為了 KEYCODE_DPAD_CENTER(23),長(zhǎng)按 5s,實(shí)現(xiàn)系統(tǒng)自動(dòng)重啟。
原理
在 Framework 層,查找長(zhǎng)按電源鍵關(guān)機(jī)相關(guān)邏輯,可以看到按鍵經(jīng)過(guò)一堆處理之后會(huì)來(lái)到 (/frameworks/base/services/core/java/com/android/server/policy/)PhoneWindowManager.java 定義的 interceptKeyBeforeQueueing函數(shù)中,這里還需注意另一個(gè)函數(shù)為 interceptKeyBeforeDispatching,注意區(qū)別。在按鍵按下時(shí)延時(shí)5s發(fā)送特定消息,在收到消息時(shí)實(shí)現(xiàn)功能,在按鍵抬起時(shí)撤銷(xiāo)延時(shí)發(fā)送的消息。下面直接說(shuō)具體做法。
添加消息邏輯
首先定義一個(gè)屬于自己的消息,可以看到,在 PhoneWindowManager.java 第820行附近,定義了一堆 private static final int MSG_XXXX = XX;
,我們需要在最后這里添加一個(gè)自己的 private static final int MSG_MY_REBOOT = 999;
定義為999是為了避免與現(xiàn)有值重復(fù)。 接下來(lái),在 handleMessage
方法中,添加該消息的處理:
private class PolicyHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_ENABLE_POINTER_LOCATION: enablePointerLocation(); break; // Add start case MSG_MY_REBOOT: mWindowManagerFuncs.reboot(false); break; // Add end ... // 省略若干行 } } }
這里直接調(diào)用了 mWindowManagerFuncs
的 reboot
方法,傳 false
進(jìn)去,表現(xiàn)為不彈窗直接進(jìn)入重啟過(guò)程,顯示“系統(tǒng)重啟中”頁(yè)面。傳 true
進(jìn)去,則彈窗提示將要關(guān)機(jī),點(diǎn)是關(guān)機(jī)重啟、點(diǎn)否取消。
添加按鍵處理
首先定義兩個(gè)函數(shù),分別進(jìn)行 KeyDown 和 KeyUp 時(shí)的處理。這兩個(gè)函數(shù)要寫(xiě)在 PhoneWindowManager 類中,注意不要寫(xiě)進(jìn)了它的內(nèi)部類里面,其實(shí)源碼中包含很多類似的 interceptXxxKeyDown
方法,寫(xiě)到與他們并列的位置即可。
// ..... // Add start private void interceptCenterKeyDown() { Message msg = mHandler.obtainMessage(MSG_MY_REBOOT); msg.setAsynchronous(true); mHandler.sendMessageDelay(msg, 5000); // 5000ms = 5seconds } private void interceptCenterKeyUp() { mHandler.removeMessages(MSG_MY_REBOOT); } // Add end private void interceptPowerKeyDown(KeyEvent event, boolean interactive) { // 省略若干行
調(diào)用按鍵處理
最后,在 interceptKeyBeforeQueueing
中添加對(duì)按鍵的攔截及處理調(diào)用
@Override public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) { if (!mSystemBooted) { // If we have not yet booted, don't let key events do anything return 0; } final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0; // 省略若干行 switch (keyCode) { case KeyEvent.KEYCODE_BACK: { if (down) { interceptBackKeyDown(); } else { boolean handled = interceptBackKeyUp(event); // Don't pass back press to app if we've already handled it via long press if (handled) { result &= ~ACTION_PASS_TO_USER; } } break; } // Add start case KeyEvent.KEYCODE_DPAD_CENTER: { if (down) { interceptCenterKeyDown(); } else { interceptCenterKeyUp(); } break; } // Add end case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_UP: // 省略若干行 } }
這里,因?yàn)樵谝话闱闆r下,我們需要把這個(gè)按鍵消息發(fā)送給應(yīng)用層,因此這里我們不進(jìn)行 result &= ~ACTION_PASS_TO_USER
的操作。
這樣,整個(gè)長(zhǎng)按重啟功能就實(shí)現(xiàn)了。
更多關(guān)于Android CENTER鍵長(zhǎng)按功能的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android從xml加載到View對(duì)象過(guò)程解析
這篇文章主要介紹了 Android從xml加載到View對(duì)象過(guò)程解析的相關(guān)資料,需要的朋友可以參考下2016-03-03詳解android特性之CoordinatorLayout用法探析實(shí)例
本篇文章主要介紹了android特性之CoordinatorLayout用法探析實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Material Design系列之Behavior實(shí)現(xiàn)支付密碼彈窗和商品屬性選擇效果
這篇文章主要為大家詳細(xì)介紹了Material Design系列之Behavior實(shí)現(xiàn)支付密碼彈窗和商品屬性選擇效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09android中DatePicker和TimePicker的使用方法詳解
這篇文章主要介紹了android中DatePicker和TimePicker的使用方法,是Android中常用的功能,需要的朋友可以參考下2014-07-07Android中自定義ContentProvider實(shí)例
應(yīng)用A(TestBaidu)調(diào)用另外一個(gè)應(yīng)用(TestContentProvider)中的自定義ContentProvider,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06Activity跳轉(zhuǎn)時(shí)生命周期跟蹤的實(shí)例
下面小編就為大家?guī)?lái)一篇Activity跳轉(zhuǎn)時(shí)生命周期跟蹤的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Android中Home鍵的監(jiān)聽(tīng)和攔截示例
本篇文章主要介紹了Android中Home鍵的監(jiān)聽(tīng)和攔截示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Android?Flutter在點(diǎn)擊事件上添加動(dòng)畫(huà)效果實(shí)現(xiàn)全過(guò)程
這篇文章主要給大家介紹了關(guān)于Android?Flutter在點(diǎn)擊事件上添加動(dòng)畫(huà)效果實(shí)現(xiàn)的相關(guān)資料,通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)Android具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03Android自定義TimeButton實(shí)現(xiàn)倒計(jì)時(shí)按鈕
這篇文章主要為大家詳細(xì)介紹了Android自定義TimeButton實(shí)現(xiàn)倒計(jì)時(shí)按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Android webview旋轉(zhuǎn)屏幕導(dǎo)致頁(yè)面重新加載問(wèn)題解決辦法
這篇文章主要介紹了Android webview旋轉(zhuǎn)屏幕導(dǎo)致頁(yè)面重新加載問(wèn)題解決辦法的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的問(wèn)題,需要的朋友可以參考下2017-10-10