Settings搜索系统SettingsIntelligence

目录

概要

代码流程图

代码流程分析

1.SettingsHomepageActivity.java

2.SearchFeatureProvider.java

3、SearchFeatureProviderImpl.java

4、SearchActivity.java

5.SearchFragment.java

6.SettingsIntelligence-SearchFeatureProviderImpl.java

7.DatabaseIndexingManager.java

8.PreIndexDataCollector.java

9.IndexDatabaseHelper.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值