Android短信搜索自动完成文本下拉列表

本文解析了Android短信搜索功能实现过程,从Activity中的onSearchRequested()方法开始,追踪至MmsSmsProvider中的数据库查询操作,并介绍了SuggestionsProvider如何展示查询结果。

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

前段时间看了下Android短信搜索功能,乘还没有忘记简单的做个学习笔记。

对于短信搜索,是直接使用了Android系统的搜索框架,当然在我们平常做项目的时候,也可以直接调用系统自带的搜索框,这个具体的怎么调用可以用Google或者百度搜索,有许多相关的资料,现在主要记录下自己阅读短息搜索源码的流程以及遇到的问题。

1. 在ConversationList.java文件中有如下一段代码:

public boolean onSearchRequested() { startSearch(null, false, null /*appData*/, false); return true;}

在这里是重写了Activity里的onSearchRequested()方法,如果我们不想在这里面做一些操作的话,可以直接调用onSearchRequested()方法。在onSearchRequested()方法里是调用了startSearch()方法。

2. 一直追踪下去可以追溯到SearchaDialog.java中。这里在搜索框中添加了一个Adapter,这个Adapter就是来显示下拉列表的,在这个类中发现在runQueryOnBackgroundThread()方法中还是回到了SearchManager的getSuggestions方法中,根据相应的Uri, mContext.getContentResolver().query(uri, null, selection, selArgs, null);去查询相关的数据库。

3. 在短信搜索这里与之相关的Uri为SuggestionsProvider,最后还是到了MmsSmsProvider中去进行数据库查询操作。

4.在MmsSmsProvider中有条查询语句:String.format("SELECT _id, index_text, source_id, table_to_use, offsets(words) FROM words WHERE words MATCH '%s*' LIMIT 50;", searchString); 这里将通过这条SQL语句进行查询,将结果以Cursor的形式进行返回。

4. 在SuggestionsProvider,这边对cursor的内容进行提取,显示在下拉列表中。但是这里可能是Google留给广大厂商去解决,就是SQLite中的 MATCH 并不能很好的匹配亚洲文字,如:汉字,韩语等。所以按照源码的话,这个短信搜索功能搜索英文还可以,但是搜索亚洲文字,则无法搜索出来。不知道以后SQLite 会不会对 MATCH 增加对非字母文字的支持。


关于offsets(),的一些说明:

offsets(),返回一系列以空格隔开的整数,至少含有4为数(以4个整数为一组返回)。

对于这四位数的解释:

第0位:表示列号

第1位:表示在该列中该字符出现的次数

第2位:在该列中匹配项字符的偏移位 (bytes)

第3位:匹配项的大小(bytes)

offsets()需要和MATCH配对使用。

关于MATCH()

MATCH : 如  MATCH 'Hi', 表示存在Hi的字符串,MATCH ‘Hi*’, 表示以Hi开头的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值