目录
1.SettingsHomepageActivity.java
3、SearchFeatureProviderImpl.java
6.SettingsIntelligence-SearchFeatureProviderImpl.java
7.DatabaseIndexingManager.java
概要
在Android系统中,Setting菜单非常多,有些菜单很难找到,因此Google支持搜索菜单功能。搜索的主要逻辑在packages/apps/SettingsIntelligence模块中。模块包名为com.android.settings.intelligence。
该模块会检索所有继承自SearchIndexablesProvider的ContentProvider,将所有数据保存至数据库
/data/data/com.android.settings.intelligence/databases/search_index.db。然后在SearchFragment中通过访问该数据库来实现搜索菜单的功能。本文重点探讨保存数据库这步流程
代码流程图
第一次从设置首页进入搜索时,会跳转到SettingsIntelligence加载数据库,以下为这个过程的流程图
代码流程分析
接下来,我会按照流程图的顺序,逐步分析相关代码,所有代码示例皆来自Android14
1.SettingsHomepageActivity.java
这个为设置首页,从这个界面顶端进入搜索
SettingsHomepageActivity.java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initSearchBarView(); //1.搜索相关的初始化
}
private void initSearchBarView() {
final Toolbar toolbar = findViewById(R.id.search_action_bar); //获取search控件
//通过Factory模式,将搜索初始化放在SearchFeatureProvider中实现
FeatureFactory.getFactory(this).getSearchFeatureProvider()
.initSearchToolbar(this /* activity */, toolbar,
SettingsEnums.SETTINGS_HOMEPAGE);
if (mIsEmbeddingActivityEnabled) { //支持分栏的设备会走这里
final Toolbar toolbarTwoPaneVersion = findViewById(R.id.search_action_bar_two_pane);
FeatureFactory.getFactory(this).getSearchFeatureProvider()
.initSearchToolbar(this /* activity */, toolbarTwoPaneVersion,
SettingsEnums.SETTINGS_HOMEPAGE);
}
}
2.SearchFeatureProvider.java
主要处理Setting Search相关逻辑,具体实现类为SearchFeatureProviderImpl
SearchFeatureProvider.java
default void initSearchToolbar(FragmentActivity activity, Toolbar toolbar, int pageId) {
final Context context = activity.getApplicationContext();
//2.获取SearchActivity的Intent,用于跳转
final Intent intent = buildSearchIntent(context, pageId)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//增加OnClickListener,点击搜索控件时,会回调onClick跳转到SearchActivity
toolbar.setOnClickListener(tb -> startSearchActivity(context, activity, pageId, intent));
}
private static void startSearchActivity(
Context context, FragmentActivity activity, int pageId, Intent intent) {
FeatureFactory.getFactory(context).getSlicesFeatureProvider()
.indexSliceDataAsync(context);
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
.logSettingsTileClick(KEY_HOMEPAGE_SEARCH_BAR, pageId);
final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity).toBundle();
//3.start SearchActivity
activity.startActivity(intent, bundle);
}
3、SearchFeatureProviderImpl.java
从这里跳转到SearchActivity
SearchFeatureProviderImpl.java
@Override
public Intent buildSearchIntent(Context context, int pageId) {
return new Intent(Settings.ACTION_APP_SEARCH_SETTINGS) //获取SearchActivity action
.setPackage(getSettingsIntelligencePkgName(context)) //获取包名
.putExtra(Intent.EXTRA_REFERRER, buildReferrer(context, pageId));
}
//获取的包名为com.android.settings.intelligence
default String getSettingsIntelligencePkgName(Context context) {
return conte