目录
附件:SearchIndexablesContract.java
一、介绍
本文是建立在,设置的搜索功能模块代码正常的基础上的。设置公共的搜索功能模块代码,后面有空会出专门的文章分析。其实本文第五个问题(5.另一个apk如何在设置里搜索显示出来,并显示设置的路径)已经教给大家如何去写数据库的方法,只不过设置做成了一个公共的搜索功能模块代码,通过注解,解析xml文件,java代码等来维护数据库)。
二、验证修改生效与否的方法以及相关操作
1.修改之后push apk到手机,然后在设置更多设置里面选择恢复出厂设置
adb push C:\Users\Administrator\Desktop\Settings.apk ./product/priv-app/Settings/
2.获取目标位置:adb shell pm path com.android.settings
/product/priv-app/Settings/Settings.apk
3.从手机里pull出来db数据库文件:
adb pull /data/data/com.android.settings.intelligence/databases/search_index.db
三、问题集
1.使用Java代码和注解添加进搜索
添加@SearchIndexable并加上下列代码:
/**
* For Search.
*/
public static final com.android.settings.search.BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new com.android.settings.search.BaseSearchIndexProvider() {
@Override
public List<android.provider.SearchIndexableResource> getXmlResourcesToIndex(
Context context, boolean enabled) {
final android.provider.SearchIndexableResource sir = new android.provider.SearchIndexableResource(context);
sir.xmlResId = R.xml.zen_mode_settings;
return Arrays.asList(sir);
}
@Override
public List<com.android.settings.search.SearchIndexableRaw> getRawDataToIndex(
Context context, boolean enabled) {
final List<com.android.settings.search.SearchIndexableRaw> result = new ArrayList<>();
final android.content.res.Resources res = context.getResources();
com.android.settings.search.SearchIndexableRaw data1 =
new com.android.settings.search.SearchIndexableRaw(context);
data1.title = res.getString(R.string.zen_mode_starting_time_title);
data1.screenTitle = res.getString(R.string.zen_mode_settings_title);
data1.keywords = res.getString(R.string.zen_mode_starting_time_title);
data1.key = KEY_START_TIME;
result.add(data1);
com.android.settings.search.SearchIndexableRaw data2 =
new com.android.settings.search.SearchIndexableRaw(context);
data2.title = res.getString(R.string.zen_mode_end_time);
data2.screenTitle = res.getString(R.string.zen_mode_settings_title);
data2.keywords = res.getString(R.string.zen_mode_end_time);
data2.key = KEY_END_TIME;
result.add(data2);
return result;
}
};
2.数据库里有数据,但无法搜索出来
1)这是因为出现了重复的id,此时会根据该id最后一次的数据库操作,来写入enabled的数据,不确定性很强。(有时候能显示,有时候不能显示)
该id出现在多个页面里,把不需要的页面的屏蔽即可。
示例:
允许通话:(zen_mode_calls)
是在ZenModePriorityCallsPreferenceController里来控制此id(zen_mode_calls)
而ZenModePriorityCallsPreferenceController在两个文件里有调用:
1.ZenModeSoundVibrationSettings(需要显示的页面)
2.ZenModeCallsSettings(原生界面)
问题出现在ZenModeCallsSettings这个页面中:
它的isPageSearchEnabled方法把enable自动置为0,所以无法搜索出来,如果把它的返回值写为true,则在搜索的时候有可能搜索出来原生的界面,而无需要显示的界面,所以最终的修改方案为,不让此页面写入数据库: