Android中的用户词库——UserDictionry


关于android.process.acore
经常看到android.process.acore会报异常,我启动android2.3.3的模拟器看了一下logcat,android.process.acore进程包含了这么几个ContentProvider:
com.android.providers.contacts.SocialProvider
com.android.providers.applications.ApplicationsProvider
com.android.providers.contacts.ContactsProvider
com.android.providers.contacts.CallLogProvider
com.android.providers.userdictionary.UserDictionaryProvider
检查一下这几个apk的AndroidManifest.xml,都有这么一个属性:android:process="android.process.acore"。看来,只要上面这几个ContentProvider其中一个出问题导致整个进程挂了的话,其它的也会受影响。


关于BackupManagerService
系统中有一个BackupManagerService服务,这个主要负责把应用程序的数据up到服务器上,当某一天用户需要恢复数据时,再从服务器上把用户的数据down下来交给各个应用。BackupManagerService有一个设定的up周期。哪个APK有数据要进行上面这样的backup/restore服务的话,只需要在AndroidManifest.xml的application标签中增加这个属性:android:backupAgent="DictionaryBackupAgent"。属性的值是实现功能的具体类。比如UserDictionaryProvider的DictionaryBackupAgent,LatinIME的LatinIMEBackupAgent。这样,当系统的BackupManagerService到了设定的周期,要进行数据同步时,就会调用BackupAgent的子类中的接口。
与BackupManagerService相关的AndroidManifest.xml属性还有android:allowClearUserData,android:killAfterRestore,等。




关于UserDictionaryProvider
UserDictionaryProvider存储了三个字段:workd,frequency,locale。即,某个单词的使用频率和所属语言,主要与输入法相关。比如,我们在输入法里面看哪个词用的比较多,就把它添加到UserDictionaryProvider里面,也可以在用户输入单词时,从UserDictionaryProvider里面取出数据来供用户备选。另外,UserDictionaryProvider还实现了一个BackupAgent来做数据的backup/restore。
向UserDictionaryProvider里面添加数据,目前我已经发现了两种方式:一个是设置->语言和键盘->用户词库,在这里可以手工添加。另一个就是使用Android自带的英文输入法时,在备选词列表上面长按某个备选词,程序就会把这个备选词添加到UserDictionaryProvider里。至于中文输入法,不管是搜狗还是谷歌拼音,都还没有发现与UserDictionaryProvider相关的功能。搜狗有自己的词库同步功能,但使用的不是UserDictionaryProvider词库。
另外,访问UserDictionaryProvider的方法不止传统的ContentProvider一种方式,framework层的android.provider.UserDictionary里面也提供了一些访问接口。


屏蔽UserDictionaryProvider的功能
两种方案:1、将UserDictionaryProvider中的增删改查接口保留,但接口中的实现去掉。为什么不去掉?因为framework向应用程序提供了访问UserDictionaryProvider的API。2、是在使用Android英文输入法时出的问题,那就不要让Android英文输入法访问UserDictionaryProvider了(修改一下/packages/app/LatinIME/../UserDictionary.java文件)。
在LatinIME源码里面的AndroidManifest.xml文件中去掉android:backupAgent属性。
这样下来,在设置程序中手工添加词库后,LatinIME里面就永远不会把词库中的词显示为备选词了。

你可能感兴趣的:(Android,Framework)