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