Android上的LocalSearch

大家都知道android平台最初是由google推出的,然后google又主导成立了OHA继续推动android的发展。现在搜索应用可能是使用率最高的一个,google最核心的产品就是搜索,因此android必定要搭载这个功能。本文就介绍一下android上的本地搜索框架。

要说本地搜索,首先就要介绍ContentProvider和ContentResolver这两个android上的重要组件。
ContentProvider
      直译就是“内容提供者”,我觉得这个很形象,他就是一个类似于数据源的东西,帮助App或者说帮助整个平台管理数据。因为android上app间的数据是相互独立的,一个app不可以直接访问另一个app的数据,有了ContentProvider这个机制,不同app间就可以互相访问数据,而且还不破坏原有的独立性。

ContentResolver
     App通过ContentProvider将自己的数据公开,其他App要访问这份数据就要通过 ContentResolver来获取对应的ContentProvider的远程访问方法,然后操作数据。ContentProvider和 ContentResolver之间是通过 Binder 机制连接的,各模块间关系如下图:

 

 

ContentProvider和ContentResolver都提供了一个query() 方法,看到这个方法名字大家应该都清楚了,搜索功能就是通过这个方法实现的。另外,Android上有一个 SearchManager 模块,是专门用于处理搜索请求的,每个 App 启动搜索功能时都要通过它。
 
Android上的搜索功能分三类:
1.网络搜索
2.App 内部资源搜索
3.本地全局搜索
其中网络搜索功能没接触过,本文不涉及。
 
App 内部资源搜索
这个功能主要就是应用了ContentProvider和ContentResolver这对组件,如下图:

 

 

一个App具有搜索功能,那么它必须有两类Activity:
SearcheableActivity可以启动搜索功能的Activity
QueryActivity用于完成搜索和显示搜索结果的Activity
 
SearcheableActivity启动搜索功能时,会调用SearchManager,然后SearchDialog会被创建,就是我们看到的搜索框。在框中输入搜索关键字压下搜索键后,SearchDialog会启动QueryActivity,ContentRrsolver的query()方法被调用,最后将搜索结果显示出来,搜索结束。
 
本地全局搜索(GlobalSearch)
这个功能的实现主要也是通过ContentProvider和ContentResolver,如下图:

 

 

通过桌面上的搜索框widget启动本地全局搜索,同样会创建SearchDialog,SearchDialog将搜索请求发送到GlobalSearch模块,GlobalSearch通过ContentResolver分别访问各个可检索App的ContentProvider,最后经过一些异步处理将结果显示在屏幕上。
 
android的本地检索功能完全是基于ContentProvider的,也就是说如果一个App没有创建ContentProvider,这个App的数据就无法被搜索。而且搜索效率完全取决于各个
ContentProvider的query()方法的执行效率,我见过的大多数ContentProvider都是通过数据库实现的,因此搜索的效率主要取决于android的数据库sqlite。
 
本文仅仅描述了搜索功能的大体实现思路,源码还是比较复杂的,这里提到的只是九牛一毛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android overlay是一种在Android应用程序中实现界面定制化的技术。通过使用overlay,开发者可以在不修改原始应用程序代码的情况下,添加、修改或替换应用程序的布局、样式和资源。在Android中,overlay通常是通过创建一个新的AndroidManifest.xml文件来实现的。\[1\] 在创建AndroidManifest.xml文件时,需要指定overlay的优先级、是否静态以及目标包名。优先级决定了overlay的显示顺序,静态表示overlay在运行时不会被修改,目标包名指定了要进行定制化的应用程序。\[1\] 除了创建AndroidManifest.xml文件,还可以参考一些相关的资料来了解更多关于Android overlay的信息。例如,可以参考http://mmmyddd.github.io/wiki/android/overlay.html和https://developer.sonymobile.com/2014/04/22/sony-contributes-runtime-resource-overlay-framework-to-android-code-example/。\[2\] 在编译后生成的apk中,overlay的路径可以根据不同的方案进行调整。一种常见的路径是vendor/overlay/TestOverlay/TestOverlay.apk,可以通过设置LOCAL_MODULE_PATH来指定路径。\[3\] #### 引用[.reference_title] - *1* *3* [Android Overlay机制](https://blog.csdn.net/weixin_44021334/article/details/130421043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android overlay简单总结](https://blog.csdn.net/Dylan_Sen/article/details/78878641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值