Android内核学习——SearchManager分析

本文探讨了Android中的SearchManager,它是搜索服务的入口,负责提供对系统应用、联系人等的搜索功能。文章详细分析了SearchManager的工作原理,包括其与ISearchManager接口、SearchManagerService的关系,以及如何进行搜索操作。此外,还提到了SuggestionsAdapter在填充搜索框数据、SearchRecentSuggestions和SearchRecentSuggestionsProvider在历史记录中的作用,以及meta-data标签和ContentProvider在搜索中的应用。
摘要由CSDN通过智能技术生成

1. 前言

Android系统提供了的一种搜索服务,利用此服务可以实现对系统中的应用、联系人、SMS等进行搜索,也提供转入浏览器中的搜索。Android Develop Blog中有一篇文章赞美了Android搜索功能的强大快捷——《Introducing Quick Search Box for Android》

SearchManager是搜索服务的入口,可以通过context.getSystemService(Context.SEARCH_SERVICE)获取SearchManager对象。SearchManager像其他ActivityManager、PackageManager等服务一样,是随系统启动一起启动的服务,并且启动后向ServiceManager注册自己,客户端最终获取搜索服务的途径也是通过binder机制向ServiceManager获取的。

从搜索的角度来看,应用可分为三类: unsearchable 类型应用、Query-Search 类型应用和 Filter-Search 类型应用。大部分应用是属于后两种。不过,即便是第一种类型,应用也仍旧支持对搜索的调用。后两种的区分就在于,Query-Search 类型应用执行 batch-mode 搜索,每一个查询字符串都被转化成结果列表;Filter-Search 类型应用则提供 filter-as-you-type 搜索。通常来讲,对基于网络的数据进行 Query Search,而对本地数据,则需要 Filter Search。

 

2. 整体类图

 


从上面的类图可以看出SearchManager提供的搜索服务最终是由ISearchManager这个接口的实现类提供的。同时SearchManager又实现了Dialog相关的两个接口OnDismissListener和OnCancelListener,以及内置一个SearchDialog,这些是为了搜索框实现服务的,因为在Android系统中的搜索服务界面就是一个Quick Search Box。下面我们就来先分析一个ISearchManager这一块提供了什么样的搜索服务以及如何提供搜索服务。

 

3.  SearchManagerService 提供搜索服务

ISearchManager是利用AIDL定义的,因此它的代码利用aapt编译生成的,组织方式使用了代理模式。ISearchManager.Stub的实现类是SearchManagerService,所以真正提供搜索服务的是这个类。

ISearchManager接口中定义搜索相关的基础服务,有如下的方法:

  • public SearchableInfo getSearchableInfo(ComponentName launchActivity) throws RemoteException;
  • public List<SearchableInfo> getSearchablesInGlobalSearch() throws RemoteException;
  • public ComponentName getGlobalSearchActivity() throws RemoteException;
  • public ComponentName getWebSearchActivity() throws RemoteException;
这些方法的实现都在SearchManagerService中,我们到这个类中看看这四个方法都提供什么样的功能。
SearchManagerService类中有个Searchables类型的属性mSearchables,它会在getSearchables方法使用的时候进行初始化。
    // This field is initialized lazily in getSearchables(), and then never modified.
    private Searchables mSearchables;
    private synchronize
AndroidSearchManager类是用于实现搜索功能的。它的主要功能是将用户输入的搜索查询发送给您的应用程序,并在应用程序中执行搜索操作。 对于匹配文件内容的搜索,您需要实现以下步骤: 1. 获取要搜索的文件列表。 2. 遍历每个文件,将其内容读取到一个字符串中。 3. 使用Java的字符串匹配函数,如contains()或matches(),在每个字符串中查找与搜索查询匹配的内容。 4. 如果找到匹配项,则将其添加到搜索结果列表中。 以下是一个示例代码,用于在给定文件夹中搜索包含特定字符串的文件: ```java public ArrayList<String> searchFiles(String folderPath, String searchString) { ArrayList<String> result = new ArrayList<>(); File folder = new File(folderPath); File[] files = folder.listFiles(); if(files != null) { for (File file : files) { if (file.isFile()) { String fileContent = readFileToString(file); if (fileContent.contains(searchString)) { result.add(file.getName()); } } } } return result; } public String readFileToString(File file) { StringBuilder stringBuilder = new StringBuilder(); try { BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } return stringBuilder.toString(); } ``` 这个示例代码将返回所有包含特定字符串的文件名的列表。您可以根据需要更改代码来返回其他信息,如文件路径或文件内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值