目的及问题由来
前几天在rendmine上收到一个bug任务,在系统设置中搜索,搜索不到“触碰付款”这一项。
于是需要查看设置中搜索这部分功能并进行修改解决这个bug。
找到问题代码位置package/apps/Settings/src/com/android/settings/search/IndexDateBaseHelper.java
查看部分代码对问题进行分析
发现这部分功能是通过将数据初始化到数据库文件中,在date/date/com.android.setings/datebases/search_index.db我们可以导出手机中的数据库文件进行查看,可以发现确实缺少了我们需要的“触碰付款”。
找到数据库初始化代码的位置
我们可以发现系统设置对数据项的构建是在searchIndexableResources类中。
对照此类中的其他搜索项的加载方式,例如“wifi设置”和“wifi高级项”sResMap.put(WifiSettings.class.getName(),
new SearchIndexableResource(
Ranking.getRankForClassName(WifiSettings.class.getName()),//需要在Ranking类中添加对应的项
NO_DATA_RES_ID,
WifiSettings.class.getName(),
R.drawable.ic_settings_wireless));
sResMap.put(AdvancedWifiSettings.class.getName(),
new SearchIndexableResource(
Ranking.getRankForClassName(AdvancedWifiSettings.class.getName()),
R.xml.wifi_advanced_settings,
AdvancedWifiSettings.class.getName(),
R.drawable.ic_settings_wireless)
);
加载需要解析的xml文件的搜索项
我们发现连段代码有一点轻微的差别,“NO_DATA_RES_ID”表示此搜索项匹配没有需要解析的xml文件,“R.xml.wifi_advanced_settings”表示需要加载和解析对应的xml文件中的title,只要搜索对应的title机会将链接到此xml的界面,此xml的解析在Index.java中if (!nodeName.equals(NODE_NAME_CHECK_BOX_PREFERENCE)) {
summary = getDataSummary(context, attrs);
String entries = null;
if (nodeName.endsWith(NODE_NAME_LIST_PREFERENCE)) {
entries = getDataEntries(context, attrs);
}
// Insert rows for the child nodes of PreferenceScreen
updateOneRowWithFilteredData(database, localeStr, title, summary, null, entries,
fragmentName, screenTitle, iconResId, rank,
keywords, intentAction, intentTargetPackage, intentTargetClass,
true, key, -1 /* default user id */);
} else {
String summaryOn = getDataSummaryOn(context, attrs);
String summaryOff = getDataSummaryOff(context, attrs);
if (TextUtils.isEmpty(summaryOn) && TextUtils.isEmpty(summaryOff)) {
summaryOn = getDataSummary(context, attrs);
}
updateOneRowWithFilteredData(database, localeStr, title, summaryOn, summaryOff,
null, fragmentName, screenTitle, iconResId, rank,
keywords, intentAction, intentTargetPackage, intentTargetClass,
true, key, -1 /* default user id */);
}
加载NO_DATA_RES_ID的搜索项
对于没有xml的“NO_DATA_RES_ID”那么就需要其会使其类中实现(implement)Indexable并在其类中定义名称为:SEARCH_INDEX_DATA_PROVIDER的SearchIndexProvider,在其中会定义加载那些设置项。
注意
在调试阶段由于这段代码是在数据库初始化的时候执行的,所以我们调试代码的时候请将数据库的版本号+1,这样数据库就会重新构建我们添加或修改的代码才会被执行。