Android 5.0上的Settings Search功能介绍
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
android在5.0及之后的版本开始支持Search功能,此功能目前用于检索Settings中的菜单。
SettingsSearch, 提供settings菜单的快速查询。在Settings APP创建时候会建立索引,查询是输
入关键字,通过此关键字在索引中找出对应的结果并显示出来。
创建索引。索引为Search的灵魂,决定了查找的结果如何。了解索引的创建过
程对Search机制非常重要。索引通过数据库保存数据,对应的代码是
IndexDatabaseHelper。更新索引数据。在SettingsActivity的onCreate方法
中呼叫getInstance(getApplicationContext()).update();进行的。
Index.java为Search机制的主要文件,务必详阅。
创建索引过程:
查找当前系统中Provider,此Provider须继承于SearchIndexablesProvider,且在manifest声
明须符合如下格式。暂且成此类provider为可索引Provider。
目前L上面继承此provider的有:
CellBroADCastSearchIndexableProvider, PhoneSearchIndexablesProvider,
SettingsSearchIndexablsProvider.
可索引Provider必须重载三个方法,提供了三类索引数据(xml,Raw data, key)。
queryXmlResources()
queryRawData()
queryNonIndexableKeys()
这些方法返回的数据就是索引所需要的数据。
例如SettingsSearchIndexablesProvider
其中,仅通过queryXmlResources来提供索引数据,另外两种为空。数据由
SearchIndexableResources.values()指定(详情请参考SearchIndexableResources.java的实现)。
每查找出一个可索引Provider,就依次的找出这三类数据。代码对应的分别是Index中的addIndexablesFroXmlResourcesUri(), addIndexablesForRawDataUri()和addNonIndexablesKeysFROMRemoteProvider()。分别存入两个list中(dataToUpdate和nonIndexableKeys,nonIndexableKeys表示此类数据不可索引,数据不会写到索引db中)
通过异步task UpdateIndexTask在背后做索引数据解析, 然后逐一写到db当中,对于解析出来的数据包含在nonIndexableKeys中的则跳过。数据解析有两种,一种是rawData(queryRawData出来的数据), 此类数据直接写入db(参考indexOneRaw方法);另外一种是来源于xml (queryXmlResources)的数据。此类数据要解析对应的xml,如果指定xmlid不是合法的则查找当前继承了Indexable.SearchIndexProvider 接口的数据(这个接口有各个class实现,统一的名称是“SEARCH_INDEX_DATA_PROVIDER”).详见processDataToUpdate。
自此索引db创建完成。
NonIndexKeys充当的角色是配合XmlResource,在查找xmlResource数据之后,写入index db之前会
检查该数据是否在NonIndexKeys中,如果存在则不会写入index。起到过滤数据的作用。
2. 数据的检索过程。
先看看检索的界面:
输入检索关键字的地方是SearchView,此View在SettingsActivity创建的时候加载进来
(mSearchView),然后根据关键字到db中查找数据。代码在SearchResultsSumary中
,onQueryTextSubmit中的参数就是关键字。通过异步task UpdateSearchResultsTask到db中查询数
据。查询到的数据存放在cursor中,通过mResultsAdater显示出来。
关于Settings Search的问题,因为这个feature是在5.0上才添加的,debug的log不多,如果遇到问
题需要根据具体的case在流程中添加log一辅助分析。另外db中的内容也很重要,在需要mtk分析的
时候db文件是必须的
索引db路径:
data/data/com.android.settings/databases/search_index.db.
IndexDatabaseHelper路径:
packages/apps/settings/src/com/android/settings/search/IndexDatabaseHelper.java
Index路径:
packages/apps/settings/src/com/android/settings/search/Index.java
[SOLUTION
]
null
android在5.0及之后的版本开始支持Search功能,此功能目前用于检索Settings中的菜单。
SettingsSearch, 提供settings菜单的快速查询。在Settings APP创建时候会建立索引,查询是输
入关键字,通过此关键字在索引中找出对应的结果并显示出来。
创建索引。索引为Search的灵魂,决定了查找的结果如何。了解索引的创建过
程对Search机制非常重要。索引通过数据库保存数据,对应的代码是
IndexDatabaseHelper。更新索引数据。在SettingsActivity的onCreate方法
中呼叫getInstance(getApplicationContext()).update();进行的。
Index.java为Search机制的主要文件,务必详阅。
创建索引过程:
查找当前系统中Provider,此Provider须继承于SearchIndexablesProvider,且在manifest声
明须符合如下格式。暂且成此类provider为可索引Provider。
目前L上面继承此provider的有:
CellBroADCastSearchIndexableProvider, PhoneSearchIndexablesProvider,
SettingsSearchIndexablsProvider.
可索引Provider必须重载三个方法,提供了三类索引数据(xml,Raw data, key)。
queryXmlResources()
queryRawData()
queryNonIndexableKeys()
这些方法返回的数据就是索引所需要的数据。
例如SettingsSearchIndexablesProvider
其中,仅通过queryXmlResources来提供索引数据,另外两种为空。数据由
SearchIndexableResources.values()指定(详情请参考SearchIndexableResources.java的实现)。
每查找出一个可索引Provider,就依次的找出这三类数据。代码对应的分别是Index中的addIndexablesFroXmlResourcesUri(), addIndexablesForRawDataUri()和addNonIndexablesKeysFROMRemoteProvider()。分别存入两个list中(dataToUpdate和nonIndexableKeys,nonIndexableKeys表示此类数据不可索引,数据不会写到索引db中)
通过异步task UpdateIndexTask在背后做索引数据解析, 然后逐一写到db当中,对于解析出来的数据包含在nonIndexableKeys中的则跳过。数据解析有两种,一种是rawData(queryRawData出来的数据), 此类数据直接写入db(参考indexOneRaw方法);另外一种是来源于xml (queryXmlResources)的数据。此类数据要解析对应的xml,如果指定xmlid不是合法的则查找当前继承了Indexable.SearchIndexProvider 接口的数据(这个接口有各个class实现,统一的名称是“SEARCH_INDEX_DATA_PROVIDER”).详见processDataToUpdate。
自此索引db创建完成。
NonIndexKeys充当的角色是配合XmlResource,在查找xmlResource数据之后,写入index db之前会
检查该数据是否在NonIndexKeys中,如果存在则不会写入index。起到过滤数据的作用。
2. 数据的检索过程。
先看看检索的界面:
输入检索关键字的地方是SearchView,此View在SettingsActivity创建的时候加载进来
(mSearchView),然后根据关键字到db中查找数据。代码在SearchResultsSumary中
,onQueryTextSubmit中的参数就是关键字。通过异步task UpdateSearchResultsTask到db中查询数
据。查询到的数据存放在cursor中,通过mResultsAdater显示出来。
关于Settings Search的问题,因为这个feature是在5.0上才添加的,debug的log不多,如果遇到问
题需要根据具体的case在流程中添加log一辅助分析。另外db中的内容也很重要,在需要mtk分析的
时候db文件是必须的
索引db路径:
data/data/com.android.settings/databases/search_index.db.
IndexDatabaseHelper路径:
packages/apps/settings/src/com/android/settings/search/IndexDatabaseHelper.java
Index路径:
packages/apps/settings/src/com/android/settings/search/Index.java
[SOLUTION
]
null
学习了~~~~~~~~
学习