Android源码解析--Quick Search in Settings
欢迎大家加入群里交流:429664282
基于:android-6.0.1_r17 f4b8ad6
Android Settings中存在一个SearchIndexablesProvider,它提供了可供快速检索的设置项。通过它,我们可以决定哪些系统设置可以被快速检索,那些可以不被检索。
SearchIndexablesProvider简介
SearchIndexablesProvider是Android标准API,在SDK中可以找到,路径是"android.provider.SearchIndexablesProvider"。它是一个虚基类,提供了一些抽象方法和常用方法。
抽象方法如下:
Cursor queryXmlResources(String[])
Cursor queryRawData(String[])
Cursor queryNonIndexableKeys(String[])
queryXmlResources方法返回一个Cursor,这个Cursor中包含了所有可以被索引的XmlResource,方法的参数是个String数组,用来表示传入查询的列。
queryRawData方法同queryRawData很类似,唯一区别是返回所有可以被索引的RawData。
queryNonIndexableKeys返回所有可以不被所有的NonIndexableKey。
检索数据来源:SearchIndexableResources
在Settings中,所有可供检索的数据资源,均被定义在SearchIndexableResources类中。
例如,Wifi设置页面的所有可供检索的数据,都通过WifiSettings.java提供。
static {
sResMap.put(WifiSettings.class.getName(),
new SearchIndexableResource(
Ranking.getRankForClassName(WifiSettings.class.getName()),
NO_DATA_RES_ID,
WifiSettings.class.getName(),
R.drawable.ic_settings_wireless));
特殊检索数据:Indexable
在Settings中,提供了一类特殊的检索数据,那就是实现了Indexable接口的类。
Indexable是定义在Settings内部的一种检索资源,通过代码的方式,返回可供检索的数据,包括SearchIndexableResource和SearchIndexRaw。
所有实现了Indexable的类,必须提供一个public static的SEARCH_INDEX_DATA_PROVIDER变量,用来供Settings利用反射获取到相应的检索数据。

检索数据提供者:SettingsSearchIndexablesProvider
在Settings中,SettingsSearchIndexablesProvider实现了SearchIndexablesProvider,并且提供了可供检索的数据资源。这个数据资源以静态map的方式定义在SearchIndexableResources中,并且在queryXmlResources方法中返回给数据请求者。

Settings并未提供任何的RawData和NonIndexableKey,所以它的queryRawData返回了一个空的Cursor。

更新检索数据库
在每次打开Settings导航页面的时候,Index.update()方法都会被调用,用来更新检索数据。

Step1. 获取所有SearchIndexablesProvider.

Step2. 添加可供检索的数据到缓存:addIndexablesFromRemoteProvider
对于每一个SearchIndexablesProvider,都需要进行这个操作。
Step2.1. 从XmlResource中添加检索数据:addIndexablesForXmlResourceUri
所有定义在SearchIndexableResources中的检索数据,均会在这一步中被添加进来。接下来,让我们看看具体实现:
Step2.1.1 获取检索数据的Cursor

Step2.1.2 创建SearchIndexableResource,并加入到更新数据的缓存列表:


Step2.2. 从RawData中添加检索数据:addIndexablesForRawDataUri
Settings并未提供任何RawData,所以我们可以忽略这个步骤。
Step3. 添加不可供检索的数据到缓存
Settings并未提供任何NonIndexableKey,所以我们可以忽略这个步骤。
Step4. 更新缓存的检索数据
更新缓存的检索数据在updateInternal()方法中实现,下面我们来逐步分析下。
缓存数据结构

到现在为止,Settings提供的检索数据均被添加到"dataToUpdate"列表中。其他两个未包含任何Settings提供的检索数据。
Step4.1 创建一个UpdateIndexTask的后台任务来更新检索数据库

我们下面只关心dataToUpdate的相关操作。
Step4.2 更新dataToUpdate缓存:processDataToUpdate
在这个方法中,我们对每一个SearchIndexableData都使用indexOneSearchIndexableData方进行更新。

Step4.3 对检索数据进行索引:indexOneSearchIndexableData
这里的检索数据可以包括RawData和XmlResource,又或者Settings返回的SearchIndexableResource。
这里为什么是SearchIndexableResource?因为SettingsSearchIndexablesProvider把所有可以检索的数据都已SearchIndexableResource插入到Cursor中,并且返回给数据查询者,这里也就是Settings本身。

Step4.4 对每一条检索数据资源进行数据检索:indexOneResource
前面我们提到过,Settings里面有一种特殊的检索数据资源:Indexable。
在这里,如果我们发现这条检索数据资源的xmlResId是NO_DATA_RES_ID,也就是说,当前这个检索数据资源是一条特殊的检索数据资源。我们就需要利用反射机制得到它的pusblic static的SEARCH_INDEX_DATA_PROVIDER。
Step4.4.1. 处理普通的检索数据资源:xmlResId != NO_DATA_RES_ID

Step4.4.1.1. 从XML中解析检索数据:indexFromResource
在这里就到了整个实现流程的最末端了,解析整个PreferenceScreen的XMl文件,并且把每一个符合条件的项加入到检索数据库。
Step4.4.2. 处理特殊的检索数据资源:Indexable

Step4.4.2.1. 从特殊的检索数据源获取检索数据:indexFromProvider
当拿到SEARCH_INDEX_DATA_PROVIDER变量后,我们得到它的两个方法返回值,根据返回值的具体内容,我们将其更新到数据库。
Android源码解析--Quick Search in Settings的更多相关文章
- android源码解析(十七)-->Activity布局加载流程
版权声明:本文为博主原创文章,未经博主允许不得转载. 好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与andr ...
- Android源码解析系列
转载请标明出处:一片枫叶的专栏 知乎上看了一篇非常不错的博文:有没有必要阅读Android源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入Android体系,决定学习an ...
- Android源码解析——LruCache
我认为在写涉及到数据结构或算法的实现类的源码解析博客时,不应该急于讲它的使用或马上展开对源码的解析,而是要先交待一下这个数据结构或算法的资料,了解它的设计,再从它的设计出发去讲如何实现,最后从实现的角 ...
- Android源码解析——Toast
简介 Toast是一种向用户快速展示少量信息的视图.当它显示时,它会浮在整个应用层的上面,并且不会获取到焦点.它的设计思想是能够向用户展示些信息,但又能尽量不显得唐突.本篇我们来研读一下Toast的源 ...
- Android源码解析——AsyncTask
简介 AsyncTask 在Android API 3引入,是为了使UI线程能被正确和容易地使用.它允许你在后台进行一些操作,并且把结果带到UI线程中,而不用自己去操纵Thread或Handler.它 ...
- Android 源码解析 之 setContentView
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41894125,本文出自:[张鸿洋的博客] 大家在平时的开发中,对于setCont ...
- Android源码解析——Handler、Looper与MessageQueue
本文的目的是来分析下 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制,通过源码来了解整个消息处理流程的走向以及相关三者之间的关系 需要先了解以 ...
- Android 源码解析之AsyncTask
AsyncTask相信大家都不陌生,它是为了简化异步请求.更新UI操作而诞生的.使用它不仅可以完成我们的网络耗时操作,而且还可以在完成耗时操作后直接的更新我们所需要的UI组件.这使得它在android ...
- 【Android源码解析】View.post()到底干了啥
emmm,大伙都知道,子线程是不能进行 UI 操作的,或者很多场景下,一些操作需要延迟执行,这些都可以通过 Handler 来解决.但说实话,实在是太懒了,总感觉写 Handler 太麻烦了,一不小心 ...
随机推荐
- 【HDOJ】3957 Street Fighter
一定要注意审题啊,题目说的是选出做少的英雄打败其余处在任何模式下的英雄.共有Sigma(num of model)个方案,每个方案有Sigma(num of model)+n个决策.挺不错的一道精确覆 ...
- C#创建Excel文件并将数据导出到Excel文件
工具原料: Windows 7,Visual Studio 2010, Microsoft Office 2007 创建解决方案 菜单>新建>项目>Windows窗体应用程序: 添加 ...
- BZOJ_1613_ [Usaco2007_Jan]_Running_贝茜的晨练计划_(动态规划)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1613 n分钟,疲劳值上限是m,开始时疲劳值为0.第i分钟可以跑d[i]米.在某一时刻,如果疲劳 ...
- POJ 3126 Prime Path 解题报告(BFS & 双向BFS)
题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...
- 《转》如何让你的网页加载时间降低到 1s 内
当初分析了定宽高值和定宽高比这两种常见的图片延迟加载场景,也介绍了他们的应对方案,还做了一点技术选型的工作. 经过一段时间的项目实践,在先前方案的基础上又做了很多深入的优化工作.最终将好奇心日报的网页 ...
- How to get FlowLayoutPanel.AutoSize to work with FlowBreak
have a problem with a FlowLayoutPanel and I don't know how to solve it. I'm placing two FlowLayoutPa ...
- 教您Photoshop中如何快速放大、缩小、移动图像
教您Photoshop中如何快速放大.缩小.移动图像 http://jingyan.baidu.com/article/ae97a646aaeaaebbfc461d5e.html
- Effect-Compiler Tool(fxc.exe)
提前编译shader文件,提高运行时的效率. refer to http://msdn.microsoft.com/en-us/library/windows/desktop/bb509710%28v ...
- RTCP
RTCP RTCP协议将控制包周期发送给所有连接者,应用与数据包相同的分发机制.低层协议提供数据与控制包的复用,如使用单独的UDP端口号.RTCP执行下列四大功能: (1) 主要是提供数据发布的质量反 ...
- leetcode—pascal triangle
1.题目描述 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows ...