最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android O實現(xiàn)Framework層CENTER鍵長按功能方法

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

需求

設(shè)備有一個按鍵,我們定義為了 KEYCODE_DPAD_CENTER(23),長按 5s,實現(xiàn)系統(tǒng)自動重啟。

原理

在 Framework 層,查找長按電源鍵關(guān)機(jī)相關(guān)邏輯,可以看到按鍵經(jīng)過一堆處理之后會來到 (/frameworks/base/services/core/java/com/android/server/policy/)PhoneWindowManager.java 定義的 interceptKeyBeforeQueueing函數(shù)中,這里還需注意另一個函數(shù)為 interceptKeyBeforeDispatching,注意區(qū)別。在按鍵按下時延時5s發(fā)送特定消息,在收到消息時實現(xiàn)功能,在按鍵抬起時撤銷延時發(fā)送的消息。下面直接說具體做法。

添加消息邏輯

首先定義一個屬于自己的消息,可以看到,在 PhoneWindowManager.java 第820行附近,定義了一堆 private static final int MSG_XXXX = XX;,我們需要在最后這里添加一個自己的 private static final int MSG_MY_REBOOT = 999; 定義為999是為了避免與現(xiàn)有值重復(fù)。 接下來,在 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)入重啟過程,顯示“系統(tǒng)重啟中”頁面。傳 true 進(jìn)去,則彈窗提示將要關(guān)機(jī),點(diǎn)是關(guān)機(jī)重啟、點(diǎn)否取消。

添加按鍵處理

首先定義兩個函數(shù),分別進(jìn)行 KeyDown 和 KeyUp 時的處理。這兩個函數(shù)要寫在 PhoneWindowManager 類中,注意不要寫進(jìn)了它的內(nèi)部類里面,其實源碼中包含很多類似的 interceptXxxKeyDown 方法,寫到與他們并列的位置即可。

	// .....
	// 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 中添加對按鍵的攔截及處理調(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:
			// 省略若干行
		}
	}

這里,因為在一般情況下,我們需要把這個按鍵消息發(fā)送給應(yīng)用層,因此這里我們不進(jìn)行 result &= ~ACTION_PASS_TO_USER 的操作。

這樣,整個長按重啟功能就實現(xiàn)了。

更多關(guān)于Android CENTER鍵長按功能的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

南皮县| 湘乡市| 灵石县| 奈曼旗| 合作市| 高密市| 上犹县| 广丰县| 岗巴县| 即墨市| 邛崃市| 革吉县| 五家渠市| 马公市| 平江县| 文成县| 峨眉山市| 和田市| 灵石县| 白水县| 遂溪县| 周至县| 蓝山县| 文登市| 伊宁县| 山东省| 顺义区| 嘉兴市| 顺义区| 临泉县| 荥经县| 西乌珠穆沁旗| 普陀区| 九寨沟县| 平果县| 和静县| 浙江省| 平顺县| 阿图什市| 壶关县| 株洲县|