SearchManager提供全局搜索服务

本文深入探讨了Android系统中的SearchManager类,介绍了如何通过它查询系统内所有支持全局搜索功能的应用,包括获取服务、应用信息及组织查询的过程。同时,阐述了应用如何通过contentProvider实现跨进程数据共享,并注册在SearchManagerService中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在适配全局搜索功能的时候发现一个类:SearchManager,从来没使用过,这个是用来查询系统内所有支持全局搜索功能的应用。相对应的服务就是SearchManagerService,类似于ActivityManagerService的作用,在系统启动的时候就启动了。

一般用法就是首先获取服务:

mAndroidSearchManager = (SearchManager) mContext.getApplicationContext().getSystemService(Context.SEARCH_SERVICE);

其次就是获取所有支持搜索的应用信息:

List<SearchableInfo> infoList = mAndroidSearchManager.getSearchablesInGlobalSearch();
for (SearchableInfo info : infoList) {
    String suggestPackage = info.getSuggestPackage();//包名
    String suggestAuthority = info.getSuggestAuthority();//其实就是定义contentProvider时候的authority
    String suggestIntentAction = info.getSuggestIntentAction();//支持的intentAction
    String suggestIntentData = info.getSuggestIntentData();//额外的数据
    String suggestPath = info.getSuggestPath();//能查询的路径
    String suggestSelection = info.getSuggestSelection();//检索的条件,也就是Sql语句where后面的条件
    ComponentName searchActivity = info.getSearchActivity();//被查询的activity}

然后根据某个SearchableInfo组织成一个uri,最终通过contentResolver去查询。

能被查询的应用本质上就是通过contentProvider来实现跨进程数据共享的。一个应用要想能被SearchManager检索到,则必须要被注册在SearchManagerService中。也就是需要在xml中声明一些属性才能被系统识别继而注册到SMS中。具体需要哪些声明可参考这个:Introducing Quick Search Box for Android

 

参考文章:SearchManager分析

### 实现全局搜索功能 在Android应用中实现全局搜索功能涉及多个组件之间的协作。具体来说,该过程依赖于四个主要部分: - **搜索管理器 (SearchManager)**:负责处理搜索请求并协调其他组件的工作。 - **全局搜索AppWidget**:提供给用户的界面入口,通常表现为首页屏幕上的一个小部件。 - **全局搜索应用**:实际执行搜索操作的应用程序,它会索引来自不同数据源的信息。 - **支持全局搜索的应用程序**:这些应用程序提供了可被搜索的数据集,比如联系人、音乐库或网页浏览历史等。 为了使自定义应用能够参与全局搜索,开发者需要注册自己的内容提供商(Content Provider),以便让系统知道哪些数据是可以公开供搜索使用的[^1]。 下面是一个简化版的例子来展示如何设置一个基本的全局搜索配置,在`res/xml/searchable.xml`文件里定义搜索参数: ```xml <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint"> </searchable> ``` 接着,在Activity中声明这个 searchable 配置,并通过调用 `onCreateOptionsMenu()` 方法将搜索框添加到选项菜单中: ```java @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.options_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); ComponentName componentName = new ComponentName(this, MySearchableActivity.class); searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName)); return true; } ``` 当用户提交查询时,系统将会启动指定用于显示结果页面的 Activity (`MySearchableActivity`) 并传递相应的 Intent 数据。在这个活动中可以通过重写 `onNewIntent(Intent intent)` 来接收和解析传入的搜索条件,进而获取匹配的结果列表。 对于更复杂的场景下,如果希望为特定类型的文件建立索引,则可能还需要利用ContentResolver接口配合FileProvider类来进行深层次集成[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值