Android高手过招之浮动搜索框(SearchManager)

最近要在通话记录上实现SearchManager效果,但是Android本身对通话记录不支持这个功能,故希望通过网上的资料可以帮助我更多的理解这个搜索机制。

       一、对SearchManager的认知
       SearchManager 的作用是提供对系统搜索服务的访问。要获取到对SearchManager的直接访问,只能通过context.getSystemService(Context.SEARCH_SERVICE)方式,试图通过初始化SearchManager是行不通的。
       从搜索的角度来看,应用可分为三类:unsearchable类型应用、Query-Search 类型应用和Filter-Search类型应用。大部分应用是属于后两种,不过,即便是第一种类型,应用也支持对搜索的调用。后两种的区分就在于:Query-Search类型应用执行batch-mode搜索,每一个查询字符串都被转化成结果列表;Filter-Search类型应用则提供filter-as-you-type搜索。通常来讲,对基于网络的数据进行Query-Search,对本地数据,则需要Filter Search。
       除非万不得已,所有的应用都要支持调出搜索界面。换言之,当用户执行了搜索命令以后,搜索界面就要呈现给用户。目前,搜索命令通常是定义在菜单栏中名为Search的选项,在一些手机上会是一个特定的搜索键。
       万一,应用属于第一种类型,你还是可以在web search模式下调出搜索界面。按下“搜索”以后,浏览器就会打开。这里需要注意,搜索界面是以浮动窗口(floating window)的形式出现,对activity stack是不会有任何改变的。
       开发者应该考虑清楚采用什么样的方式来处理搜索请求,以下是四种建议:
       1.自行捕获搜索命令,包括搜索按钮和菜单项,直接调用搜索界面。
       该建议在定义菜单项的时候,Andriod 已经默认提供了一些资源,开发者可以使用android.R.drawable.ic_search_category_default作为菜单项的icon,同时使用SearchManager.MENU_KEY作为快捷键。然后调用onSearchRequested()即可 。
       2.提供type-to-search,用户输入任何字符的同时自动启用搜索。
       该建议需要在Activity里,调用setDefaultKeyMode,如下所示:
       // search within your activity
       setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
       // search using platform global search
       setDefaultKeyMode(DEFAULT_KEYS_SEARCH_GLOBAL);
       3.万一应用是unsearchable,则允许通过搜索键(或者搜索菜单性)进行全局搜索。
       该建议就是使用Quick Search Box进行对设备和网络的搜索,有两种方式可供选择。其一:在application或activity中定义search,也就是在mainifest中增加一个meta-data;其二:通过默认实现onSearchRequest()触发全局搜索(也可以通过startSearth(String, boolean, Bundle, boolean))
       4.彻底禁用搜索。
       该建议要覆写 onSearchRequest() 方法,如下所示:
       @Override
       public boolean onSearchRequested() {
             return false;
       }
       当搜索界面出现,原来的activity 就会失去输入焦点;当搜索结束时,会有三种可能的结果:
       1.用户取消了搜索界面,原来的 activity重新获得输入焦点。可以通过setOnDismissListener(SearchManager.OnDismissListener) 和setOnCancelListener(SearchManager.OnCancelListener) 来获取清除搜索界面的事件通知。
       2.如果用户执行了搜索,这就需要切换到另外一个activity来接收和处理search Intent,原来的activity 就可能进入pause 或者stop 状态。
       3.如果用户执行了搜索,并且当前的activity 就是search Intent 的接收者,则需要通过onNewIntent方法来接收消息。

       二、关于SearchManager很好的一个例子
       具体使用步骤如下:
       1.配置search bar的相关信息,新建一个位于res/xml下的一个searchable.xml的配置文件。
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="

相关推荐

  1. Android高手浮动搜索(SearchManager)

    2024-04-25 21:42:01       37 阅读
  2. Android 8.1 删除Launcher桌面搜索

    2024-04-25 21:42:01       32 阅读
  3. 搜索中文输入导致高频触发的优化

    2024-04-25 21:42:01       40 阅读
  4. div浮动高度丧失问题

    2024-04-25 21:42:01       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 21:42:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 21:42:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 21:42:01       87 阅读
  4. Python语言-面向对象

    2024-04-25 21:42:01       96 阅读

热门阅读

  1. 黑马点评学习笔记总结

    2024-04-25 21:42:01       40 阅读
  2. SQL之CASE WHEN用法详解

    2024-04-25 21:42:01       32 阅读
  3. C++ day3

    C++ day3

    2024-04-25 21:42:01      36 阅读
  4. 传输层协议

    2024-04-25 21:42:01       25 阅读
  5. 跨域问题+解决跨域express

    2024-04-25 21:42:01       37 阅读
  6. 如何使用PHP进行邮件发送?

    2024-04-25 21:42:01       35 阅读
  7. 【MHA】MySQL高可用MHA介绍2-安装,配置,要求与限制

    2024-04-25 21:42:01       24 阅读
  8. C#多线程之(Thread)详解与示例

    2024-04-25 21:42:01       30 阅读
  9. MacOS - 打开 App 无法验证开发者解决方案

    2024-04-25 21:42:01       32 阅读
  10. C语言面经

    2024-04-25 21:42:01       31 阅读
  11. Linux错误(3)Linux里IP套接字sendmsg出现EPERM错误

    2024-04-25 21:42:01       24 阅读
  12. Node.js

    2024-04-25 21:42:01       30 阅读
  13. 什么是Spring容器中的组件

    2024-04-25 21:42:01       32 阅读