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获取哪些已经安装了的组件可以提供搜素“能力”,获得该组件的包名等信息。这样子搜索功能即可以调用该组件来递交关键字等信息,进而执行搜索逻辑。

 

posted @ 2015-04-27 17:57  soaringEveryday  阅读(305)  评论(0编辑  收藏  举报