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
的subclassSpellCheckerService
實作了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的輸入法編輯器,
也包含了一個拼字檢查的範例。
沒有留言:
張貼留言