Home | History | Annotate | Download | only in text
      1 page.title=Spelling Checker Framework
      2 page.tags="input","spellcheckerservice"
      3 @jd:body
      4 <div id="qv-wrapper">
      5 <div id="qv">
      6 <h2>In This Document</h2>
      7 <ol>
      8     <li>
      9         <a href="#SpellCheckLifeCycle">Spell Check Lifecycle</a> 
     10     </li>
     11     <li>
     12         <a href="#SpellCheckImplementation">Implementing a Spell Checker Service</a>
     13     </li>
     14     <li>
     15         <a href="#SpellCheckClient">Implementing a Spell Checker Client</a>
     16     </li>
     17 </ol>
     18   <h2>See also</h2>
     19   <ol>
     20     <li>
     21         <a href="{@docRoot}resources/samples/SpellChecker/SampleSpellCheckerService/index.html">
     22         Spell Checker Service</a> sample app
     23     </li>
     24     <li>
     25         <a href="{@docRoot}resources/samples/SpellChecker/HelloSpellChecker/index.html">
     26         Spell Checker Client</a> sample app
     27     </li>
     28   </ol>
     29 </div>
     30 </div>
     31 
     32 <p>
     33     The Android platform offers a spelling checker framework that lets you implement   
     34     and access spell checking in your application. The framework is one of the 
     35     Text Service APIs offered by the Android platform.
     36 </p>
     37 <p>
     38     To use the framework in your app, you create a special type of Android service that 
     39     generates a spelling checker <strong>session</strong> object. Based on text you provide,
     40     the session object returns spelling suggestions generated by the spelling checker.
     41 </p>
     42 <h2 id="SpellCheckLifeCycle">Spell Checker Lifecycle</h2>
     43 <p>
     44     The following diagram shows the lifecycle of the spelling checker service:
     45 </p>
     46 <img src="{@docRoot}resources/articles/images/spellcheck_lifecycle.png" alt="" height="596"
     47     id="figure1" />
     48 <p class="img-caption">
     49   <strong>Figure 1.</strong> The spelling checker service lifecycle.
     50 </p>
     51 <p>
     52     To initiate spell checking, your app starts its implementation of the spelling checker
     53     service. Clients in your app, such as activities or individual UI elements, request a
     54     spelling checker session from the service, then use the session to get suggestions for text.
     55     As a client terminates its operation, it closes its spelling checker session. If necessary, your
     56     app can shut down the spelling checker service at any time.
     57 </p>
     58 <h2 id="SpellCheckImplementation">Implementing a Spell Checker Service</h2>
     59 <p>
     60     To use the spelling checker framework in your app, add a spelling checker service component including
     61     the session object definition. You can also add to your app an optional activity that
     62     controls settings. You must also add an XML metadata file that describes
     63     the spelling checker service, and add the appropriate elements to your manifest file.
     64 </p>
     65 <h3 id="SpellCheckCode">Spell checker classes</h3>
     66 <p>
     67     Define the service and session object with the following classes:
     68 </p>
     69 <dl>
     70     <dt>
     71         A subclass of {@link android.service.textservice.SpellCheckerService}
     72     </dt>
     73     <dd>
     74         The {@link android.service.textservice.SpellCheckerService} implements both the
     75         {@link android.app.Service} class and the spelling checker framework interface. Within your
     76         subclass, you must implement the following method:
     77         <dl>
     78             <dt>{@link android.service.textservice.SpellCheckerService#createSession()}</dt>
     79             <dd>
     80                 A factory method that returns a
     81                 {@link android.service.textservice.SpellCheckerService.Session} object to a
     82                 client that wants to do spell checking.
     83             </dd>
     84         </dl>
     85         <p>
     86             See the
     87             <a href="{@docRoot}resources/samples/SpellChecker/SampleSpellCheckerService/index.html">
     88             Spell Checker Service</a> sample app to learn more about implementing this class.
     89         </p>
     90     </dd>
     91     <dt>
     92         An implementation of {@link android.service.textservice.SpellCheckerService.Session}
     93     </dt>
     94     <dd>
     95         An object that the spelling checker service provides to clients, to let them pass text to
     96         the spelling checker and receive suggestions. Within this class, you must implement the
     97         following methods:
     98         <dl>
     99             <dt>
    100                 {@link android.service.textservice.SpellCheckerService.Session#onCreate()}
    101             </dt>
    102             <dd>
    103                 Called by the system in response to
    104                 {@link android.service.textservice.SpellCheckerService#createSession()}. In this
    105                 method, you can initialize the
    106                 {@link android.service.textservice.SpellCheckerService.Session} object based on
    107                 the current locale and so forth.
    108             </dd>
    109             <dt>
    110      {@link android.service.textservice.SpellCheckerService.Session#onGetSentenceSuggestionsMultiple(TextInfo[], int)
    111      onGetSentenceSuggestionsMultiple()}
    112             </dt>
    113             <dd>
    114                 Does the actual spell checking. This method returns an array of
    115                 {@link android.view.textservice.SentenceSuggestionsInfo} containing
    116                 suggestions for the sentences passed to it.
    117             </dd>
    118         </dl>
    119         <p>
    120             Optionally, you can implement
    121             {@link android.service.textservice.SpellCheckerService.Session#onCancel()}, which
    122             handles requests to cancel spell checking,
    123             {@link android.service.textservice.SpellCheckerService.Session#onGetSuggestions(TextInfo, int)
    124             onGetSuggestions()}, which handles a word suggestion request, or
    125             {@link android.service.textservice.SpellCheckerService.Session#onGetSuggestionsMultiple(TextInfo[], int, boolean)
    126             onGetSuggestionsMultiple()}, which handles batches of word suggestion requests.
    127         </p>
    128         <p>
    129             See the
    130             <a href="{@docRoot}resources/samples/SpellChecker/HelloSpellChecker/index.html">
    131             Spell Checker Client</a> sample app to learn more about implementing this class.
    132         </p>
    133     </dd>
    134 </dl>
    135 <p class="note">
    136     <strong>Note:</strong> You must implement all aspects of spell checking as asynchronous and
    137     thread-safe. A spelling checker may be called simultaneously by different threads running on
    138     different cores. The {@link android.service.textservice.SpellCheckerService} and
    139     {@link android.service.textservice.SpellCheckerService.Session} take care of this
    140     automatically.
    141 </p>
    142 <h3 id="SpellCheckXML">Spell checker manifest and metadata</h3>
    143 <p>
    144     In addition to code, you need to provide the appropriate manifest file and a metadata file for
    145     the spelling checker.
    146 </p>
    147 <p>
    148     The manifest file defines the application, the service, and the activity for controlling
    149     settings, as shown in the following snippet:
    150 </p>
    151 <pre>
    152 &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
    153     package="com.example.android.samplespellcheckerservice" &gt;
    154     &lt;application
    155         android:label="&#64;string/app_name" &gt;
    156         &lt;service
    157             android:label="&#64;string/app_name"
    158             android:name=".SampleSpellCheckerService"
    159             android:permission="android.permission.BIND_TEXT_SERVICE" &gt;
    160             &lt;intent-filter &gt;
    161                 &lt;action android:name="android.service.textservice.SpellCheckerService" /&gt;
    162             &lt;/intent-filter&gt;
    163 
    164             &lt;meta-data
    165                 android:name="android.view.textservice.scs"
    166                 android:resource="&#64;xml/spellchecker" /&gt;
    167         &lt;/service&gt;
    168 
    169         &lt;activity
    170             android:label="&#64;string/sample_settings"
    171             android:name="SpellCheckerSettingsActivity" &gt;
    172             &lt;intent-filter &gt;
    173                 &lt;action android:name="android.intent.action.MAIN" /&gt;
    174             &lt;/intent-filter&gt;
    175         &lt;/activity&gt;
    176     &lt;/application&gt;
    177 &lt;/manifest&gt;
    178 </pre>
    179 <p>
    180     Notice that components that want to use the service must request the permission
    181     {@link android.Manifest.permission#BIND_TEXT_SERVICE} to ensure that only the system binds to
    182     the service. The service's definition also specifies the <code>spellchecker.xml</code> metadata
    183     file, which is described in the next section.
    184 </p>
    185 <p>
    186     The metadata file <code>spellchecker.xml</code> contains the following XML:
    187 </p>
    188 <pre>
    189 &lt;spell-checker xmlns:android="http://schemas.android.com/apk/res/android"
    190         android:label="&#64;string/spellchecker_name"
    191         android:settingsActivity="com.example.SpellCheckerSettingsActivity"&gt;
    192     &lt;subtype
    193             android:label="&#64;string/subtype_generic"
    194             android:subtypeLocale="en
    195     /&gt;
    196     &lt;subtype
    197             android:label="&#64;string/subtype_generic"
    198             android:subtypeLocale="fr
    199     /&gt;
    200 &lt;/spell-checker&gt;
    201 </pre>
    202 <p>
    203     The metadata specifies the activity that the spelling checker uses for controlling settings. It
    204     also defines subtypes for the spelling checker; in this case, the subtypes define locales that
    205     the spelling checker can handle.
    206 </p>
    207 
    208 
    209 <!--  Accessing the Spell Checker Service from a Client -->
    210 <h2 id="SpellCheckClient">Accessing the Spell Checker Service from a Client</h2>
    211 <p>
    212     Applications that use {@link android.widget.TextView} views automatically benefit from spell
    213     checking, because {@link android.widget.TextView} automatically uses a spelling checker. The
    214     following screenshots show this:
    215 </p>
    216 <img src="{@docRoot}resources/articles/images/textview_spellcheck_screenshot_1.png" alt=""
    217     height="45" id="figure2a" />
    218 <br>
    219 <img src="{@docRoot}resources/articles/images/textview_spellcheck_screenshot_2.png" alt=""
    220     height="121" id="figure2b" />
    221 <p class="img-caption">
    222   <strong>Figure 2.</strong> Spell checking in TextView.
    223 </p>
    224 <p>
    225     However, you may want to interact directly with a spelling checker service in other cases as well.
    226     The following diagram shows the flow of control for interacting with a spelling checker service:
    227 </p>
    228 <img src="{@docRoot}resources/articles/images/spellcheck_client_flow.png" alt=""
    229     height="393" id="figure3" />
    230 <p class="img-caption">
    231   <strong>Figure 3.</strong> Interacting with a spelling checker service.
    232 </p>
    233 <p>
    234     The <a href="{@docRoot}resources/samples/SpellChecker/HelloSpellChecker/index.html">
    235     Spell Checker Client</a> sample app shows how to interact with a spelling checker service. The
    236     LatinIME input method editor in the Android Open Source Project also contains an example of
    237     spell checking.
    238 </p>
    239