2013年4月11日 星期四

[Android] Android Developer Note Text and Input 3

Spelling Checker Framework

(見Android Developer Spelling Checker)

序言:

Android平台提供了拼字檢查的framework,
讓你可以實作並在你的app中存取拼字檢查。
framework是Text Service APIs的其中之一,
由Android平台所提供。

要使用app裡的framework,
你要做一個特別型態的Android service,
用以產生一個拼字檢查器的session物件。
根據你所提供的文字,
session物件會回傳由拼字檢查器產生的拼字建議。

Spell Checker Lifecycle:

下面的流程圖展示了拼字檢查器的服務的生命週期:

要初始拼字檢查的時候,
你的app開始它的拼字檢查服務的實作。
在你的app的clients,比如說activities或者個別的UI元素,
從服務來request拼字檢查器的session,
接著使用session來取得文字的建議。
當client終止它的操作時,它關上它的拼字檢查器的session。
如果必要的話,你的app可以將拼字檢查器的service在任何時間關掉。

Implementing a Spell Checker Service:

要在你的app裡使用拼字檢查器的framework,
將一個拼字檢查器service的組件,
包括了session物件的定義。
你也可以將做為控制設定的選擇性的activity加到你的app。
你必須要加XML metadata檔案以描述拼字檢查服務,
且將適當的元素加到manifest檔上。

Spell checker classes:

使用下列的classes來定義了服務以及session物件:
一個SpellCheckerService的subclass
    SpellCheckerService實作了Service class,
以及拼字檢查器的framework介面。在你的subclass裡,
你必須要實作下面的method:
    createSession()
        一個factory method,
回傳一個SpellCheckerService.Session物件
到要做拼字檢查的client。
    可以看Spell Checker Service的sample app來學習更多這個class的實作。

SpellCheckerService.Session的實作
    拼字檢查器服務提供給clients的物件,
用以讓他們將文字傳到拼字檢查器,並取得建議。
在class裡面,你必須實作下面的methods:

    onCreate()
        被系統呼叫,用以回應createSession()
在這個method,你可以初始化SpellCheckerService.Session物件,
基於現有的locale以及其他。
    onGetSentenceSuggestionsMultiple()
        作確切的拼字檢查。
這個method回傳一個SentenceSuggestionsInfo的陣列,
包括sentences傳到的建議。

    你可以選擇性的實作onCancel(),以處理requests來取消拼字檢查;
onGetSuggestions(),以處理一個單字建議的request;
或是onGetSuggestionsMultiple()
以處理批次的單字建議的requests。

    可以參照Spell Checker Client來學習更多實作這個class的方法。

注意: 你必須將所有方面的拼字檢查實作成非同步且thread-safe。
一個拼字檢查器也許會同時被不同的code上所跑的不同的threads來呼叫。
SpellCheckerService以及SpellCheckerService.Session會自動處理好這件事情。

Spell checker manifest and metadata:

在code以外,你需要去提供適當的manifest檔,
還有一個metadata檔給拼字檢查器。
manifest檔定義了app,service,以及activity給控制設定,
就像在下面片段所展示的那樣。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.samplespellcheckerservice" >
    <application
        android:label="@string/app_name" >
        <service
            android:label="@string/app_name"
            android:name=".SampleSpellCheckerService"
            android:permission="android.permission.BIND_TEXT_SERVICE" >
            <intent-filter >
                <action android:name="android.service.textservice.SpellCheckerService" />
            </intent-filter>

            <meta-data
                android:name="android.view.textservice.scs"
                android:resource="@xml/spellchecker" />
        </service>

        <activity
            android:label="@string/sample_settings"
            android:name="SpellCheckerSettingsActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>
    </application>
</manifest>

注意要使用service的組件,必須要request BIND_TEXT_SERVICE的permission ,
來確保只有系統結合到service。
service的定義同時也指定了spellchecker.xml的metadata檔,
在下一個section來描述。

spellchecker.xml metadata檔案包含了下面的XML:

<spell-checker xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/spellchecker_name"
        android:settingsActivity="com.example.SpellCheckerSettingsActivity">
    <subtype
            android:label="@string/subtype_generic"
            android:subtypeLocale="en”
    />
    <subtype
            android:label="@string/subtype_generic"
            android:subtypeLocale="fr”
    />
</spell-checker>

metadata指定了activity,讓拼字檢查使用控制設定。
它也定義了拼字檢查的子型態,
在這個狀況下,子型態定義了拼字檢查器可以處理的locales。

Accessing the Spell Checker Service from a Client:

app使用TextView的views,自動從拼字檢查得益,
因為TextView會自動使用拼字檢查器。下面的螢幕截圖展示了這個:


無論如何,你也許也想要在其他狀況裡,
去直接和拼字檢查服務來互動。
下面的流程圖展示了和拼字檢查器服務互動的控制流。

Spell Checker Client的sample app,
顯示了如何去和拼字檢查服務來互動。
在Android Open Source Project裡的LatinIME的輸入法編輯器,
也包含了一個拼字檢查的範例。

沒有留言:

張貼留言