The input event dispatch engine is in WindowManagerService.java. WindowManagerService.java creates a thread to read input event from KeyInputQueue.java and dispatches the event to the window which has current focus through binder.
// Retrieve next event, waiting only as long as the next
// repeat timeout. If the configuration has changed, then
// don't wait at all -- we'll report the change as soon as
// we have processed all events.
QueuedEvent ev = mQueue.getEvent(
(int)((!configChanged && curTime < nextKeyTime)
? (nextKeyTime-curTime) : 0));
If an input event is read, it judges the input event type. Currently support three input event types: key, trackball and pointer. Then according to event type call corresponding dispatch function to the window which has current focus through binder. For example, for key event, it calls the following code.
focus.mClient.dispatchKey(event);
At the lowest level, Android reads the real input event (keyboard, mouse or touch) from Linux input device. The corresponding source code is EventHub.cpp. For key input event, Android maps scan code to key code according to a key layout map file. OEM needs customize the key layout map file to match the needs of his own device. It uses the following method to find out the key layout map file.
// a more descriptive name
ioctl(mFDs[mFDCount].fd, EVIOCGNAME(sizeof(devname)-1), devname);
devname[sizeof(devname)-1] = 0;
device->name = devname;
// replace all the spaces with underscores
strcpy(tmpfn, devname);
for (char *p = strchr(tmpfn, ' '); p && *p; p = strchr(tmpfn, ' '))
*p = '_';
// find the .kl file we need for this device
const char* root = getenv("ANDROID_ROOT");
snprintf(keylayoutFilename, sizeof(keylayoutFilename),
"%s/usr/keylayout/%s.kl", root, tmpfn);
bool defaultKeymap = false;
if (access(keylayoutFilename, R_OK)) {
snprintf(keylayoutFilename, sizeof(keylayoutFilename),
"%s/usr/keylayout/%s", root, "qwerty.kl");
defaultKeymap = true;
}
device->layoutMap->load(keylayoutFilename);
OEM can get the key layout map file name during Android booting, because Android will log the name. The JAVA layer wrapper is KeyInputQueue.java which is used by WindowManagerService.java. It calls EventHub.cpp through JNI. com_android_server_KeyInputQueue.cpp is the JNI implementation.
Input Event Processing
When an activity is to be launched, ActivityManagerService.java calls ActivityThread.java for creating the activity.
activity.attach(appContext, this, getInstrumentation(), r.token, app,
r.intent, r.activityInfo, title, r.parent, r.embeddedID,
r.lastNonConfigurationInstance, config);
Then Activity.java creates a PhoneWindow.java instance to represent the activity. Each PhoneWindow.java contains a DecorView.java instance as the root of any views in the activity.
mWindow = PolicyManager.makeNewWindow(this);
mWindow.setCallback(this);
After an activity is created, ActivityManagerService.java calls ActivityThread.java for resume the activity. At this time, ActivityThread.java calls WindowManagerImpl.java to add the DecorView.java instance.
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
wm.addView(decor, l);
WindowManagerImpl.java news a ViewRoot.java instance. ViewRoot.java has a static member which will be only initialized once for each process. It’s used to let WindowManagerService.java know that there is a process linked now.
if (!mInitialized) {
try {
sWindowSession = IWindowManager.Stub.asInterface(
ServiceManager.getService("window"))
.openSession(new Binder());
mInitialized = true;
} catch (RemoteException e) {
}
}
After ViewRoot.java instance is created, WindowManagerImpl.java calls its setView API to bind the ViewRoot.java for the DecorView.java.
// do this last because it fires off messages to start doing things
root.setView(view, wparams, panelParentView);
In setView API, ViewRoot.java finally draws the DecorView.java and registers an IWindow instance to WindowManagerService.java.
res = sWindowSession.add(mWindow, attrs,
getHostVisibility(), mCoveredInsets);
After that WindowManagerService.java directly communicates (including dispatching input event) with this IWindow instance in ViewRoot.java. Then ViewRoot.java calls View.java to process input event. For example, for key event, dispatchKeyEvent API in View.java will be called.
public boolean dispatchKeyEvent(KeyEvent event) {
// If any attached key listener a first crack at the event.
//noinspection SimplifiableIfStatement
if (mOnKeyListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& mOnKeyListener.onKey(this, event.getKeyCode(), event)) {
return true;
}
return event.dispatch(this);
}
View.java detects if any key listener is registered for this view. If so, the key event will be handled by the key listener. Otherwise, it calls OnKeyDown/OnKeyUp as usual.
All the key listener implementations are under frameworks/base/core/java/android/text/method folder.
MultiTapKeyListener.java - if the keypad is NUMERIC keypad, this listener is used to transform digit inputs to characters.
QwertyKeyListener.java – if the keypad is QWERTY keypad, this listener is used.
分享到:
相关推荐
Measuring the Impact of Event Dispatching and Concurrency Models on Web Server Performance Over High-speed NetworksJames C. Hu�, Irfan Pyaraliy, Douglas C. Schmidtfjxh,irfan,schmidt g@cs.wustl....
Shows how to host ActiveScript in a Delphi application. Includes event dispatching.
Economic Dispatching using Nested PSO
这个是用支持向量机求解AGVs调度的python代码,需要的可以拿去,有研究车间调度和AGV调度或者两者集成调度的可以参考。
通过MATLAB,使用粒子群算法(PSO)实现电力系统的经济调度。调度代码清晰,适合做电力系统经济调度的相关学习
TweenMax extends the extremely lightweight, fast TweenLite engine, adding many useful features like timeScale, AS3 event dispatching, updateTo(), yoyo
34-戴杰-2020_Context-Aware_Taxi_Dispatching_at_City-Scale_Using_Deep_Reinforcement_Learning1
Lotus: a library for handling interaction between pages or modules in Android. Implemented based on Google Lifecycle-aware and the classic observer pattern. Features Observers have life-cycle ...
Kobold Kit 是一个基于苹果的 Sprite Kit 框架的 2D... Event Dispatching Update Scheduling Audio Engine (ObjectAL) Lua Scripting Deploy to iOS, OS X and Android via Apportable 标签:Kobold
TESLA:一个融入全局公平性的出租车集中调度方法,荣辉桂,张群,出租车服务在城市交通系统中扮演着一个重要的角色,然而,传统的出租车商业模式一直存在效率低下的问题。智能手机和移动计算的发
The communication software tasks provided by ACE include event demultiplexing and event handler dispatching, signal handling, service initialization, interprocess communication, shared memory ...
The communication software tasks provided by ACE include event demultiplexing and event handler dispatching, signal handling, service initialization, interprocess communication, shared memory ...
python库。 资源全名:Dispatching-1.4.0-py33-none-any.whl
资源来自pypi官网。 资源全名:dispatching-dns-0.0.15.tar.gz
资源来自pypi官网。 资源全名:Dispatching-1.3.0-py33-none-any.whl
TestSuite: Event Test (Event dispatching operations.) Baseline time: 0 Test: dispatchHandled (Dispatch and handle an event.) time: 127, min: 127, max: 127, average: 127, deviation: 0 time: 125, ...
一般来说,这个线程是事件派发线程(event-dispatching thread)。 如果需要从事件处理(event-handling)或绘制代码以外的地方访问UI,那么可以使用SwingUtilities类的invokeLater()或invokeAndWait()方法。
dispatching submit event to a method, generating and storing error messages and rendering a view. DialogAction allows to create robust user inteface, which can withstand Refresh, Back and Forward ...