SQLiteDatabase
可以看到Android上的SQLite更多信息 . 可以在 Searchable Dictionary看到一个用FTS3实现搜索的示例。
android.net
可一看到更多的network APIs ,在 Creating a Progress Dialog 可以到看到如何显示一个进度条。
<activity>
元素中加入<meta-data>。
这个<meta-data>必须包含“
android:value”属性,该属性指明了
searchable activity的类名,
android:name”
,且其值必须为 "android.app.default_searchable"
.
SearchableActivity和
OtherActivity),
OtherActivity
也是在它的
search dialog中
使用SearchableActivity
执行searches操作。
<!-- this is the searchable activity; it performs searches -->
<activity android:name=".SearchableActivity" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
<!-- this activity enables the search dialog to initiate searches
in the SearchableActivity -->
<activity android:name=".OtherActivity" ... >
<!-- enable the search dialog to send searches to SearchableActivity -->
<meta-data android:name="android.app.default_searchable"
android:value=".SearchableActivity" />
</activity>
...
</application>
因为在OtherActivity
中已经包含了一个<meta-data>元素,它声明了使用哪个searchable activity来执行搜索,所以它的search dialog也变得可用。
按下手机的
SEARCH按钮(如果有的话)或调用onSearchRequested()都将激活search dialog.
一旦用户在search dialog中执行search操作, 系统将启动SearchableActivity
并向其传送ACTION_SEARCH
intent.
提示:searchable activity 自己默认就提供了the search dialog ,且它的searchable activity就是自己本身,所以不需要再声明.
如果你想为你的应用程序的每个activity 都提供该search dialog, 那么请
<meta-data>
元素加入<application>
作为其儿子, 而不是加入到每个<activity>
. 通过这种方式, 每个activity 都继承了该值, 提供search dialog, 并把searches传送到同一个searchable activity. (如果你有多个searchable activities, 你可以在单个activitiy中加入不同的<meta-data>来声明
searchable activity,这样就重写了默认的searchable activity )六、如何启动search dialog
正如上面所提到的,如果当前activity声明了使用searchable activity,那么按下
手机的
SEARCH按钮(如果有的话)或调用onSearchRequested()都将激活search dialog.然而,SEARCH按钮并不是所有的设备上都有,所以你需要在你的UI中提供一个搜索按钮,
以便通过调用onSearchRequested()激活search dialog 。
例如,你可以在Options Menu的一个菜单项或在你的activity的布局的按钮中调用
onSearchRequested()来启动
search dialog.search_icons.zip 文件中有针对medium and high density屏幕的搜索图标,你可以在你的搜索菜单项或按钮中使用它(low-density screens scale-down the hdpi image by one half).
你也可以使用"type-to-search"功能, 这样当用户在键盘进行输入的时候,将激活search dialog,并且是直接输入到search dialog.
你可以在activity的
onCreate()
中调用setDefaultKeyMode
(DEFAULT_KEYS_SEARCH_LOCAL
)来开启该功能
七、search dialog对Activity生命周期的影响
Dialog。它并不引起Activity栈的任何改变。
所以当search dialog 被启动的时候, 并不会有生命周期函数被调动(比如onPause()
)。你的activity只是失去输入焦点,因为输入焦点被转移到了search dialog.
onSearchRequested()
方法.
setOnCancelListener()注册监听器
OnDismissListener/OnCancelListener来监听
search dialog的关闭. 当search dialog 关闭的时候,OnDismissListener就会被调用。OnCancelListener
只是在用户显式的退出search dialog时, 才被调用,当用户执行搜索的时候并不会被调用(这种情况用户只是很自然的消失,并不取消).
onCreate()
来响应 该ACTION_SEARCH
intent ,然后这个activity的一个新实例将被放到activity stack。这时你的searchable activity就有两个实例在activity stack 中(如果按下BACK键,将回到前一个searchable activity实例,
android:launchMode
属性设置为了 "singleTop"
, 那么searchable activity 将调用onNewIntent(Intent)来响应该ACTION_SEARCH
, 同时ACTION_SEARCH
intent也是在这里被传入 .下面的示例5, 就是一个当searchable activity的launch mode 是 "singleTop"时,该如何处理的一个很好例子。
示例5:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doMySearch(query);
}
}
这里所有对search intent的处理都是放在
handleIntent()
函数中的, 这样 在onCreate()
和onNewIntent()
中直接调用它就行了.当系统调用
onNewIntent(Intent)的时候,表示
activity并不是新建的, 所以getIntent()返回的还是
在onCreate()中接受到的intent
. 因此你必须在onNewIntent(Intent)调用
setIntent(Intent)来 (这样保存的intent才被更新,之后你可以同过getIntent()来取得它
).使用
"singleTop"
是常用的处理方法, 因为一旦用户执行了一次搜索,它往往还想执行一次搜索,而且创建大量的searchable activity不太好。因此建议把所有的searchable activity 都在manifest中把它设置为"singleTop"
模式 。比如,示例6
<activity android:name=".SearchableActivity"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/></activity>:
八、向searchable activity传送数据
有时,你可能想在searchable activity收到的搜索关键字的基础上再添加些内容。然而有时添加的内容依取决于启动search dialog的Activity。Anroid可以让你在系统向searchable activity发送的intent时候,向该intent添加你的数据。
ACTION_SEARCH
intent通过携带一个名叫APP_DATA的
Bundle来携带你的数据。为了传送你的数据,请在要执行搜索请求的Acitivity中重写
onSearchRequested()
,创建一个Bundle,并把你要携带的数据放在其中,然后以Bundle为参数之一来调用
startSearch()激活
search dialog.比如,示例7:
@Override
public boolean onSearchRequested() {
Bundle appData = new Bundle();
appData.putBoolean(SearchableActivity.JARGON, true);
startSearch(null, false, appData, false);
return true;
}返回"true"表示你已经成功处理了该回调事件,调用
startSearch()是为了激活
search dialog. 一旦用户提交了搜索请求, 它将和你添加的数据一样被传送到searchable activity。 你可以通过APP_DATA
Bundle来提取它。
比如:
示例8:Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}注意:不要在
onSearchRequested()之外调用
startSearch()方法。
当需要在你的activity中激活search dialog请总是onSearchRequested()
. 否则, 如果onSearchRequested()没被调用,一些个性化得操作就不能得到执行
(比如上面例子的添加额外数据)
七、search dialog对Activity生命周期的影响
Dialog。它并不引起Activity栈的任何改变。
所以当search dialog 被启动的时候, 并不会有生命周期函数被调动(比如onPause()
)。你的activity只是失去输入焦点,因为输入焦点被转移到了search dialog.
onSearchRequested()
方法.
setOnCancelListener()注册监听器
OnDismissListener/OnCancelListener来监听
search dialog的关闭. 当search dialog 关闭的时候,OnDismissListener就会被调用。OnCancelListener
只是在用户显式的退出search dialog时, 才被调用,当用户执行搜索的时候并不会被调用(这种情况用户只是很自然的消失,并不取消).
onCreate()
来响应 该ACTION_SEARCH
intent ,然后这个activity的一个新实例将被放到activity stack。这时你的searchable activity就有两个实例在activity stack 中(如果按下BACK键,将回到前一个searchable activity实例,
android:launchMode
属性设置为了 "singleTop"
, 那么searchable activity 将调用onNewIntent(Intent)来响应该ACTION_SEARCH
, 同时ACTION_SEARCH
intent也是在这里被传入 .下面的示例5, 就是一个当searchable activity的launch mode 是 "singleTop"时,该如何处理的一个很好例子。
示例5:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doMySearch(query);
}
}
这里所有对search intent的处理都是放在
handleIntent()
函数中的, 这样 在onCreate()
和onNewIntent()
中直接调用它就行了.当系统调用
onNewIntent(Intent)的时候,表示
activity并不是新建的, 所以getIntent()返回的还是
在onCreate()中接受到的intent
. 因此你必须在onNewIntent(Intent)调用
setIntent(Intent)来 (这样保存的intent才被更新,之后你可以同过getIntent()来取得它
).使用
"singleTop"
是常用的处理方法, 因为一旦用户执行了一次搜索,它往往还想执行一次搜索,而且创建大量的searchable activity不太好。因此建议把所有的searchable activity 都在manifest中把它设置为"singleTop"
模式 。比如,示例6
<activity android:name=".SearchableActivity"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/></activity>:
八、向searchable activity传送数据
有时,你可能想在searchable activity收到的搜索关键字的基础上再添加些内容。然而有时添加的内容依取决于启动search dialog的Activity。Anroid可以让你在系统向searchable activity发送的intent时候,向该intent添加你的数据。
ACTION_SEARCH
intent通过携带一个名叫APP_DATA的
Bundle来携带你的数据。为了传送你的数据,请在要执行搜索请求的Acitivity中重写
onSearchRequested()
,创建一个Bundle,并把你要携带的数据放在其中,然后以Bundle为参数之一来调用
startSearch()激活
search dialog.比如,示例7:
@Override
public boolean onSearchRequested() {
Bundle appData = new Bundle();
appData.putBoolean(SearchableActivity.JARGON, true);
startSearch(null, false, appData, false);
return true;
}返回"true"表示你已经成功处理了该回调事件,调用
startSearch()是为了激活
search dialog. 一旦用户提交了搜索请求, 它将和你添加的数据一样被传送到searchable activity。 你可以通过APP_DATA
Bundle来提取它。
比如:
示例8:Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}注意:不要在
onSearchRequested()之外调用
startSearch()方法。
当需要在你的activity中激活search dialog请总是onSearchRequested()
. 否则, 如果onSearchRequested()没被调用,一些个性化得操作就不能得到执行
(比如上面例子的添加额外数据)