七、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()没被调用,一些个性化得操作就不能得到执行
(比如上面例子的添加额外数据
)