android settings 语言列表,Android O Settings源码流程分析(搜索栏篇(中))-Go语言中文社区...

Android O Settings

Settings 搜索栏

中篇——实现原理

初始化候选项:

相关类:

/packages/apps/Settings/src/com/android/settings/SettingsActivity.java

/packages/apps/Settings/src/com/android/settings/search/SearchActivity.java

/packages/apps/Settings/src/com/android/settings/search/SearchFragment.java

/packages/apps/Settings/src/com/android/settings/search/SearchFeatureProviderImpl.java

/packages/apps/Settings/src/com/android/settings/search/DatabaseIndexingManager.java

/packages/apps/Settings/src/com/android/settings/search/IndexDatabaseHelper.java

/packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

/frameworks/base/core/java/android/provider/SearchIndexableResource.java

/packages/apps/Settings/src/com/android/settings/search/SettingsSearchIndexablesProvider.java

/frameworks/base/core/java/android/provider/SearchIndexablesProvider.java

首先来分析系统设置可以对哪些设置项进行构建搜索数据库,并且是如何加载的;

SearchFragment.java——>onCreate():

ebc0fe68f52b209372bf68999cc952fb.png

……

50d8b4926e0d04501f9721a195fb9418.png

cd10466b61bebe65edc7e6ce09ce3d35.png

SearchFeatureProviderImpl.java——>updateIndexAsync():

4c3185abf6c23306bb89c840cd23f5ec.png

getIndexingManager():

04fa0f83e9d61c88bc75a39de00fac3d.png

DatabaseIndexingManager.java——>indexDatabase():

f02fd7058dcab9554e762770121519eb.png

可以看到在方法中开启了一个线程任务IndexingTask:

5177bd447fde6850df879bec27e66c6f.png

它在后台所执行的方法 performIndexing():

fcec95e9a847c6434d4c5e1fb5106584.png

d7d42ce9587ebe51bcc4957b587e9180.png

91a463378cd9d7955c09864db8772d0a.png

首先 查找系统中所有的配置了"android.content.action.SEARCH_INDEXABLES_PROVIDER"的Provider

添加其他APP的设置项 :addIndexablesFromRemoteProvider();

添加其他APP中不需要被搜索到的设置项 :addNonIndexablesFromRemoteProvider();

上面的addIndexablesFromRemoteProvider会添加设置项到内存中的一个mDataToProcess对象里,然后updateDate()将该对象更新到数据库中

来看addIndexablesFromRemoteProvider()方法:

fb8febb01b73148b84d2fcefbd119cd8.png

根据当前包名创建对应包的context对象。

根据当前包名构建指定URI,例如,

settings:content://com.android.settings/settings/indexables_xml_res

然后通过context对象查找对应的Provider的数据

所有的要被列入搜索项的所在的APP的Provider都要继承SearchIndexablesProvider

SearchIndexablesProvider继承ContentProvider;

b6791c4eb885665cd6cf9568386ede5e.png

……

78e12fc37a007c76bc90f904ff29522d.png

0b7d1d3cda5960ee54b3d316da638d50.png

在该类中定义了查询路径并且实现通过匹配不同Uri进行查找;

而在Settings中,则是由SettingsSearchIndexablesProvider实现相应查询逻辑

4ead44dabfb980de1b6d4c55fdb2120b.png

在该类中采用Matrix构建虚拟的数据表,并通过SearchIndexableResource.values获取到所有添加到map集合中的SearchIndexableResource;

回到addIndexablesFromRemoteProvider();

看一下方法addIndexablesForXmlResourceUri():

e7324fa1591e7d45dc02e0efca898738.png

首先获取到指定包对应的ContentResolver,然后解析Cursor数据并且添加到UpdateData对象的dataToUpdate属性中,该属性是一个List集合;

fc684f80914e190274cdf73dcb1cbbf4.png

回到performIndexing()继续分析

然后执行方法updateDatabase():

860890ede0b948ad4e83436b5b35e130.png

接着看方法addDataToDatabase():(加载数据到搜索数据库中)

d0075e4ba59d619b2e503f8d95a3898f.png

看它里面的重要方法indexOneSearchIndexableData():

77b64f839a4207892318c5736cf2a92c.png

两种添加到数据库中的方法;

接着看方法indexOneResource():

096e2ee884f48846a30d151297f47530.png

……

66ca9d69a1dd7a9c31e36bf32e5fed80.png

6fd21249d20bfdb2a7ce1fdcbcf97db5.png

……

364f4d7d468728fa4d26642e650efd3e.png

……

c35d89c2e52924647182a8321ba87b37.png

indexFromResource() --> 使用XmlResourceParser解析xml布局

b74603ac3e947e7f3c93724e61dc9e0d.png

……

2ce0e79ddce3a7197776ce06a252bc38.png

……

54e4f5a5728b81bea865026e15c3da8b.png

indexFromProvider() --> 获取需要解析的布局,再次调用indexFromResource()方法;

38585f6a02f4dd1d4ef1d68993d16305.png

178eb1f2819e1e44ddd60925f525a65b.png

……

03c73bb59c8a97781c955589be1b93b6.png

updateOneRowWithFilteredData() --> updateOneRow() --> 此方法最终将解析的数据更新至数据库

在此过程中涉及到了一个组装数据的类SearchIndexableResources.java

例如将WiFi相关设置项加入到搜索数据匹配库:

c7b6bd1c3558ca12a2bf58ac3c232375.png

添加有两种方式:

一种是直接在new SearchIndexableResource() 时传入布局文件;

另一种为"NO_DATA_RES_ID"表示此搜索项匹配没有需要解析的xml文件,此xml的解析在DatabaseIndexingManager.java中,

采用第二种时,需要在对应的类中创建一个SEARCH_INDEX_DATA_PROVIDER,类型为SearchIndexProvider,继承BaseSearchIndexProvider并复写其两个方法: getXmlResourcesToIndex() 和 getNonIndexableKeys().

02c342cc60fb7063d904bedf2f240f9c.png

这些“WiFi”候选项被存入一个HashMap中 :

e09f3cc05f3b53fced05fd43169cb84a.png

以候选项类名作为key,把每个候选项封装成SearchIndexableResource对象作为value;

c93210a35f48b6ab4054b8b77fd3c036.png

而SearchIndexableResource是继承于SearchIndexableData:

df9bdf60a06365b3f6bd32df674489eb.png

而它是出现在addDataToDatabase()中循环遍历的对象,然后添加至数据库中;

再次回到方法 performIndexing(),很显然一个和数据库相关的类:IndexDatabaseHelper.java:

39f8205f16965660b44106351a369979.png

……

通过名字可以看出数据库search_index.db是与搜索索引相关的数据库

数据库路径:/data/user_de/0/com.android.settings/databases/search_index.db

search_index.db 数据库的prefs_index表格中存放的就是搜索的设置选项

注:该数据库的初始化不是在开机时,而是在每一次打开Settings或者切换用户时进行。(系统为每一个用户维护一个单独的search_index)

至此,Settings搜索框初始化搜索索引完成;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值