欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android O實(shí)現(xiàn)Framework層CENTER鍵長(zhǎng)按功能方法

 更新時(shí)間:2022年08月24日 09:50:03   作者:深海Enoch  
這篇文章主要為大家介紹了Android O實(shí)現(xiàn)Framework層CENTER鍵長(zhǎng)按功能方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

需求

設(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)用了 mWindowManagerFuncsreboot 方法,傳 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)文章

最新評(píng)論