Android之输入法开发简单说明
创建一个输入法,必须继承android.inputmethodservice.InputMethodService,它作为一个服务,监听所有EditText的事件。
看一个AndroidManifest.xml文件的示例:
01.<manifest xmlns:android="http://schemas.android.com/apk/res/android"02. package="com.example.fastinput">03. 04. <application android:label="@string/app_label">05. 06. <!-- Declares the input method service -->07. <service android:name="FastInputIME"08. android:label="@string/fast_input_label"09. android:permission="android.permission.BIND_INPUT_METHOD">10. <intent-filter>11. <action android:name="android.view.InputMethod" />12. </intent-filter>13. <meta-data android:name="android.view.im" android:resource="@xml/method" />14. </service>15. 16. <!-- Optional activities. A good idea to have some user settings. -->17. <activity android:name="FastInputIMESettings" android:label="@string/fast_input_settings">18. <intent-filter>19. <action android:name="android.intent.action.MAIN"/>20. </intent-filter>21. </activity> 22. </application>23.</manifest>
整个输入法的生命周期如下图所示:

Input View
软键盘的主界面,在InputMethodService.onCreateInputView() 初始化.
Candidates View
This is where potential word corrections or completions arepresented to the user for selection. Again, this may or may not berelevant to your input method and you can return null from calls toInputMethodService.onCreateCandidatesView() , which is the defaultbehavior.


InputMethodService.onStartInputView() 输入法开始函数。
(EditorInfo.inputType & EditorInfo.TYPE_CLASS_MASK ) can be one of many different values, including:
TYPE_CLASS_NUMBER
TYPE_CLASS_DATETIME
TYPE_CLASS_PHONE
TYPE_CLASS_TEXT
See android.text.InputType for more details.
EditorInfo.inputType can contain other masked bits that indicatethe class variation and other flags. For example,TYPE_TEXT_VARIATION_PASSWORD or TYPE_TEXT_VARIATION_URI orTYPE_TEXT_FLAG_AUTO_COMPLETE .
Password fields
Pay specific attention when sending text to password fields. Makesure that the password is not visible within your UI - in neither theinput view nor the candidates view. And do not save the passwordanywhere without explicitly informing the user.
Landscape vs. portrait
The UI needs to be able to scale between landscape and portraitorientations. In non-fullscreen IME mode, leave sufficient space forthe application to show the text field and any associated context.Preferably, no more than half the screen should be occupied by the IME.In fullscreen IME mode this is not an issue.
Sending text to the application
There are two ways to send text to the application. You can eithersend individual key events or you can edit the text around the cursorin the application's text field.
To send a key event, you can simply construct KeyEvent objects and call InputConnection.sendKeyEvent(). Here are some examples:
1.InputConnection ic = getCurrentInputConnection();2.long eventTime = SystemClock.uptimeMillis();3.ic.sendKeyEvent(new KeyEvent(eventTime, eventTime,4. KeyEvent.ACTION_DOWN, keyEventCode, 0, 0, 0, 0,5. KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));6.ic.sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,7. KeyEvent.ACTION_UP, keyEventCode, 0, 0, 0, 0,8. KeyEvent.FLAG_SOFT_KEYBOARD|KeyEvent.FLAG_KEEP_TOUCH_MODE));
Or use the convenience method:
1.InputMethodService.sendDownUpKeyEvents(keyEventCode);
Note : It is recommended to use the above method forcertain fields such as phone number fields because of filters that maybe applied to the text after each key press. Return key and delete keyshould also be sent as raw key events for certain input types, asapplications may be watching for specific key events in order toperform an action.
When editing text in a text field, some of the more useful methods on android.view.inputmethod.InputConnection are:
getTextBeforeCursor()
getTextAfterCursor()
deleteSurroundingText()
commitText()
For example, let's say the text "Fell" is to the left of the cursor. And you want to replace it with "Hello!":
1.InputConnection ic = getCurrentInputConnection();2.ic.deleteSurroundingText(4, 0);3.ic.commitText("Hello", 1);4.ic.commitText("!", 1);
Composing text before committing
If your input method does some kind of text prediction or requiresmultiple steps to compose a word or glyph, you can show the progress inthe text field until the user commits the word and then you can replacethe partial composition with the completed text. The text that is beingcomposed will be highlighted in the text field in some fashion, such asan underline.
1.InputConnection ic = getCurrentInputConnection();2.ic.setComposingText("Composi", 1);3....4.ic.setComposingText("Composin", 1);5....6.ic.commitText("Composing ", 1);

Intercepting hard key events
Even though the input method window doesn't have explicit focus,it receives hard key events first and can choose to consume them orforward them along to the application. For instance, you may want toconsume the directional keys to navigate within your UI for candidateselection during composition. Or you may want to trap the back key todismiss any popups originating from the input method window. Tointercept hard keys, override InputMethodService.onKeyDown() andInputMethodService.onKeyUp(). Remember to call super.onKey * if youdon't want to consume a certain key yourself.
Other considerations
Provide a way for the user to easily bring up any associated settings directly from the input method UI
Provide a way for the user to switch to a different input method(multiple input methods may be installed) directly from the inputmethod UI.
Bring up the UI quickly - preload or lazy-load any largeresources so that the user sees the input method quickly on tapping ona text field. And cache any resources and views for subsequentinvocations of the input method.
On the flip side, any large memory allocations should be releasedsoon after the input method window is hidden so that applications canhave sufficient memory to run. Consider using a delayed message torelease resources if the input method is in a hidden state for a fewseconds.
Make sure that most common characters can be entered using theinput method, as users may use punctuation in passwords or user namesand they shouldn't be stuck in a situation where they can't enter acertain character in order to gain access into a password-lockeddevice.
Samples
For a real world example, with support for multiple input typesand text prediction, see LatinIME source code . The Android 1.5 SDKalso includes a SoftKeyboard sample as well
浙公网安备 33010602011771号