android search
网上看到两篇文章,
一个说明如何在app中加入搜索功能(调用android SDK)
http://zhouyunan2010.iteye.com/blog/1134147
一个说明了search功能在fwk中如何实现
http://willsunforjava.iteye.com/blog/1674817
这里给出一个自己的一个总结:
1.首先定义“被搜索者”
App中要有个“被搜索者”的组件(可以看做是tizen中的某个app里面的某个view/naviframe),即这个“被搜索者”提供了具体的搜索逻辑,只要在它的manifest加入下列intent filter即可
<intent-filter> <action android:name="android.intent.action.SEARCH"/> </intent-filter>
这样子packageManager就可以获知这个组件是个“被搜索者”(具体如何获知后面说)
在被搜索组件中复写onNewIntent方法,这里定义了具体的搜索逻辑。当“搜索发出者”发出搜索命令并指定该“被搜索者”来处理时,这里个onNewIntent被调用,同时传过来搜索关键字等数据。
2. 当“搜索发出者”app可以通过searchDialog或者searchView来调用搜索功能
通过查看源码可以发现都是调用SearchManager来获取具体的搜索功能,获取“被搜索者的信息”,例如:
//SearchDialog.java SearchManager searchManager = (SearchManager)mContext.getSystemService(Context.SEARCH_SERVICE); // Try to get the searchable info for the provided component. mSearchable = searchManager.getSearchableInfo(componentName);
SearchManager是android fwk里面定义的一个类,其具体实现类是SearchManagerService.java
3. SearchManagerService是如何知道“被搜索者”信息的
SearchManagerService通过PackageManager提供的queryIntentActivities方法来解析查询声明了android.intent.action.SEARCH的组件,抽取包名。同时注册了一个PackageMonitor来监听本地安装包的改变(比如新加/删除了app)随后发出一个广播,第三方app使用者可以监听这个广播来做出对应的措施
4. 综上,searchDialog或者searchView即可以通过SearchManagerService获取哪些已经安装了的组件可以提供搜素“能力”,获得该组件的包名等信息。这样子搜索功能即可以调用该组件来递交关键字等信息,进而执行搜索逻辑。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?