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 類(lèi)中,注意不要寫(xiě)進(jìn)了它的內(nèi)部類(lèi)里面,其實(shí)源碼中包含很多類(lèi)似的 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 定位系統(tǒng)(GPS)開(kāi)發(fā)詳解
GPS定位是智能手機(jī)上一個(gè)比較有意思的功能,LBS等服務(wù)都有效的利用了GPS定位功能,本文就跟大家分享下Android開(kāi)發(fā)中的GPS定位知識(shí)2016-07-07
Android編程實(shí)用技術(shù)小結(jié)
這篇文章主要介紹了Android編程實(shí)用技術(shù),實(shí)例匯總了開(kāi)機(jī)啟動(dòng)receiver、service使用、AlarmManager發(fā)送廣播及停止AlarmManager等相關(guān)技巧,需要的朋友可以參考下2016-01-01
Android 自定義imageview實(shí)現(xiàn)圖片縮放實(shí)例詳解
這篇文章主要介紹了Android 自定義imageview實(shí)現(xiàn)圖片縮放實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
基于Flutter制作一個(gè)火箭發(fā)射動(dòng)畫(huà)
北京時(shí)間10月16日0時(shí)23分,神舟十三號(hào)飛船成功發(fā)射,為慶祝這一喜事,本文將用Flutter制作一個(gè)火箭發(fā)射動(dòng)畫(huà),感興趣的小伙伴可以動(dòng)手試一試2022-03-03
Flutter質(zhì)感設(shè)計(jì)之底部導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Flutter質(zhì)感設(shè)計(jì)之底部導(dǎo)航的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android開(kāi)發(fā)之開(kāi)發(fā)者頭條(一)啟動(dòng)頁(yè)實(shí)現(xiàn)
這篇文章主要介紹了Android開(kāi)發(fā)之開(kāi)發(fā)者頭條(一)啟動(dòng)頁(yè)實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-04-04
Android實(shí)現(xiàn)手勢(shì)滑動(dòng)和簡(jiǎn)單動(dòng)畫(huà)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)手勢(shì)滑動(dòng)和簡(jiǎn)單動(dòng)畫(huà)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Android webview與js的數(shù)據(jù)交互
有了WebView這個(gè)組件,Android應(yīng)用開(kāi)發(fā)技術(shù)也就轉(zhuǎn)嫁到html與java數(shù)據(jù)交互上來(lái)。說(shuō)白了就是js與WebView的數(shù)據(jù)交互,這就是本文所要討論的2017-04-04

