From: http://www.w3c.com.cn/%E4%BB%A5android%E7%8A%B6%E6%80%81%E6%A0%8F%E8%99%9A%E6%8B%9F%E6%8C%89%E9%94% AE %E6%B6%88%E6%81%AF%E4%B8%BA%E4%BE%8B%E5%AD%A6%E4%B9%A0%E5%9C%A8input%E7%B3%BB%E7%BB%9F%E6%8F%92%E5%85%A5%E6%8C%89
Taking the android status bar as an example to learn how to insert key messages in the input system
Recently, we have been considering how to convert key messages not generated by the local hardware into hardware key messages for processing. This situation is common and necessary in practical applications. Starting from android4.0, The systembar of the tablet has several buttons at the bottom of the tablet, including "return", "menu", "Recent", "vol +", and "vol -. These are all software icons. Click this icon, and systemui converts a corresponding key message to post to the system, and windowsmanager then responds accordingly. Then how does systemui work?
I followed it carefully. The corresponding file in android4.2 SDK is frameworks \ base \ packages \ systemui \ SRC \ com \ Android \ systemui \ statusbar \ Policy \ keybuttonview. java, which provides the conversion of key messages. The key code is as follows:
void sendEvent(int action, int flags) { sendEvent(action, flags, SystemClock.uptimeMillis()); } void sendEvent(int action, int flags, long when) { final int repeatCount = (flags & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0; final KeyEvent ev = new KeyEvent(mDownTime, when, action, mCode, repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, flags | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY, InputDevice.SOURCE_KEYBOARD); InputManager.getInstance().injectInputEvent(ev, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); }
We can see that the core is to first create a new message object, then forcibly insert a message through the injectinputevent method of the getinstance of the inputmanager object, and then dispatch the message.
In the application of the automotive terminal, key messages are generally processed by a single-chip microcomputer. After the single-chip microcomputer is processed, it uses a serial port to provide the master chip. Generally, the serial port drivers of the master chip are standard tty devices. In actual development, we generally do not intercept this message in the driver, because such serial port interconnection generally carries certain control messages, resolution required. The key message obtained through the serial port is already a definite value, but how can it be applied? Android has a complete set of processing for this input message. Therefore, we need to convert it into a hardware key message. Fortunately, Android has long considered this situation, so we can use injectinputevent to insert a message. Based on the above study, I also did some tests, which is indeed feasible. The added call test code is as follows:
mDownTime = SystemClock.uptimeMillis(); mCode = 24; sendEvent(KeyEvent.ACTION_DOWN, 0, mDownTime);
The SDK Source Code contains the essence. You can take a closer look at the code to learn a lot.