Setting学习(七)-搜索框(实现原理)

从上面已经知道搜索框布局的具体加载是在SearchFragment中进行的,下面就来看看SearchFragment的onCreate方法:
\packages\apps\settings\src\com\android\settings\search\SearchFragment.java
在这里插入图片描述
在onCreate方法中调用了SearchFeatureProvider的updateIndexAsync方法,它的具体实现是在SearchFeatureProviderImpl中实现的,在前面的onAttach方法中创建了mSearchFeatureProvider对象:
在这里插入图片描述
下面看看updateIndexAsync方法的具体内容:
==packages\apps\settings\src\com\android\settings\search\SearchFeatureProviderImpl.java ==
在这里插入图片描述
在updateIndexAsync中调用了getIndexingManager的indexDatabase方法,getIndexingManager返回的是mDatabaseIndexingManager对象:
在这里插入图片描述
就是说,最后调用的是DatabaseIndexingManager的indexDatabase方法
==packages\apps\settings\src\com\android\settings\search\DatabaseIndexingManager.java ==
在这里插入图片描述
在方法中启动了一个异步任务:
在这里插入图片描述
它在doInBackground中,相当于后台执行的方法是performIndexing
在这里插入图片描述
在performIndex中首先找到所有配置android.content.action.SEARCH_INDEXABLES_PROVIDER的provider:
\frameworks\base\core\java\android\provider\SearchIndexablesContract.java
在这里插入图片描述
addIndexablesFromRemoteProvider 添加要搜索的app的设置项

addNonIndexablesKeysFromRemoteProvider 添加不需要设置到快速搜索的设置项

updateDatabase 将数据更新到数据库之中

来看看addIndexablesFromRemoteProvider方法:
在这里插入图片描述
在上面的方法中,主要做了下面几件事:
1 .根据包名创建对应包的context对象
2 .根据authority创建指定的Uri
在这里插入图片描述
3 .通过context对象查找对应的Provider的数据
注意 :所有的要被列入搜索项的所在的APP的Provider都要继承SearchIndexablesProvider,而SearchIndexablesProvider继承ContentProvider
下面初始化要添加到数据库里的数据:
在这里插入图片描述
先获得指定包的ContentResolver,然后解析Cursor数据添加到mDataToProcess对象的dataToUpdate属性中:
在这里插入图片描述
dataToUpdate是一个list,“public List dataToUpdate”
数据加载完以后然后回到performIndexing,现在mDataToProcess中有数据,通过updateDatabase()方法把数据添加到快速搜索的数据库中
在这里插入图片描述
然后调用addDataToDatabase方法:
在这里插入图片描述
调用了indexOneSearchIndexableData方法:
在这里插入图片描述
indexOneSearchIndexableData中有两种方式添加到数据库中,接下来看看indexOneResource
在这里插入图片描述
可以看到如果sir.xmlResId > SearchIndexableResources.NO_DATA_RES_ID>如果为真,就是能够获取到搜索项的xml,就可以直接调用indexFromResource 方法进行解析xml,不然就调用indexFromProvider方法:
在这里插入图片描述
可以发现在这里面获取到要解析的xml文件后,也是调用indexFromResource来进行解析xml文件的,现在来看看indexFromResource的具体内容:
在indexFromResource解析布局:
在这里插入图片描述
解析完布局后调用updateOneRowWithFilteredData–> updateOneRow()方法添加到数据库
此方法最终将解析的数据更新至数据库
在这里插入图片描述
最后再回到performIndexing方法中,可以看到一个明显数据库相关的类IndexDatabaseHelper
在这里插入图片描述
这个数据明显和搜索索引相关的数据库,search_index.db 数据库的prefs_index表格中存放的就是搜索的设置选项。数据库路径
:/data/user_de/0/com.android.settings/databases/search_index.db
注意:该数据库的初始化不是在开机的时候进行的,在你第一次点进Settting搜索的时候回初始化一次,但是你再次点击进去不会再次初始化

如何添加或删除一个快速搜索

这涉及到了一个组装数据的类SearchIndexableResources.java
在这里插入图片描述
在添加一个快速搜索的时候有两种方式
一种是在新建SearchIndexableResource对象的时候,传入布局文件,如
DateTimeSettings.java
\packages\apps\settings\src\com\android\settings\DateTimeSettings.java
在这里插入图片描述
看到在创建SearchIndexableResource对象时候传入了R.xml.date_time_prefs文件
还有一种是“ NO_DATA_RES_ID”的,表示搜索匹配项里没有要解析的XML文件,在你添加好自己的写的设置项以后,需要在自己的文件里面创建SearchIndexProvider 的变量SEARCH_INDEX_DATA_PROVIDER,并继承BaseSearchIndexProvider内部类,然后重写getXmlResourcesToIndex,getNonIndexableKeys().等方法:
在这里插入图片描述
然后在SearchIndexableResources.java里面添加上面你写的文件:
在这里插入图片描述
第一个参数,类名;第二个参数,表示没有要加载的配饰文件;第三个参数,图标
要删除setting里面的快速搜索的话,在上面添加的两个方法,任意删除一个都可以,不过一般是在类的getNonIndexableKeys方法里面添加要移除的key
packages/apps/Settings/src/com/android/settings/accessibility/AccessibilitySettings.java
有时候仅仅移除这里还不够,因为有些快速搜索还被添加到了AccessibilitySettings.java类中,此时也需要在AccessibilitySettings.java类的getNonIndexableKeys()方法添加要移除的key

参考:https://blog.youkuaiyun.com/qq_34149526/article/details/83378184

为了深入理解Android 6.0蓝牙模块的工作原理,我们需要借助《Android 6.0 蓝牙模块深度解析:架构与时序图》这一资源。该资料详细介绍了Android 6.0蓝牙的软件架构设计,以及各个子模块的功能和框架,同时提供了关键操作的时序图,帮助开发者更直观地掌握蓝牙模块的运行机制。 参考资源链接:[Android 6.0 蓝牙模块深度解析:架构与时序图](https://wenku.youkuaiyun.com/doc/curwq1d39p?spm=1055.2569.3001.10343) Setting模块是用户与蓝牙系统交互的入口,负责蓝牙电源管理、设备名称管理、设备查询等功能。在Setting子模块的时序图中,可以看到从用户开启蓝牙设置界面到实际开启或关闭蓝牙电源的整个流程,以及搜索新设备和管理已配对设备的步骤。 OPP模块支持蓝牙设备之间的对象推送,如文件传输。在对应的时序图中,可以观察到对象发送和接收的过程,包括数据传输服务如何响应请求和处理数据传输。 HFP模块允许用户通过蓝牙耳机实现免提通话功能。HFP时序图展示了电话接听和拨打的步骤,重点在于通话管理和服务发现组件如何协同工作以确保稳定的语音通信。 A2DP模块提供高质量音频流的传输,适用于蓝牙音箱等音频设备。A2DP时序图解释了音频流的建立过程,从音频编码解码到连接管理和流控制。 PAN模块使蓝牙设备能够作为网络接入点或连接到网络。PAN时序图展示了网络服务发现和连接管理的步骤,包括设备如何加入或被加入网络。 HID模块支持蓝牙键盘、鼠标等输入设备。HID时序图描述了HID设备的连接和数据传输流程,包括设备连接和事件处理。 PBAP模块允许蓝牙设备访问手机联系人信息。PBAP时序图显示了手机联系簿获取的流程,重点在于联系人数据的同步和请求处理。 MAP模块使用户能够通过蓝牙设备访问和管理短信。MAP时序图描绘了获取短信的步骤,展示了短信服务和消息传输的交互。 此外,文档还涵盖了BLE技术相关的模块,解释了BLE扫描、客户端和服务器角色的工作流程,以及它们与传统蓝牙模块的交互方式。 通过这些时序图,开发者可以清晰地看到每个子模块的功能如何协同工作,以及它们在整个蓝牙模块中扮演的角色。如果你希望更深入地学习Android蓝牙技术,这份资料将是你不可或缺的学习工具。 参考资源链接:[Android 6.0 蓝牙模块深度解析:架构与时序图](https://wenku.youkuaiyun.com/doc/curwq1d39p?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值