Searchable(四)

七、search dialog对Activity生命周期的影响

search dialog 只是一个浮动在屏幕上的 Dialog。它并不引起Activity栈的任何改变。 所以当search dialog 被启动的时候, 并不会有生命周期函数被调动(比如onPause())。你的activity只是失去输入焦点,因为输入焦点被转移到了search dialog.
如果你想在启动search dialog的时候被notified,那么请重写ActivityonSearchRequested()方法.
当系统调用该方法的时候,说明你的activity已经失去输入焦点,输入焦点已经转移到了search dialog, 所以你就可以针对这个事件在这里做些和你的work相关的事情(比如暂停游戏).在onSearchRequested的最后你再调用父类的onSearchRequested就可以了。
比如 示例4
@Override public boolean onSearchRequested() {
pauseSomeStuff();
return super.onSearchRequested();
}
如果用户通过按BACK键取消搜索的话,search dialog 将关闭 ,你的activity将再次获得输入焦点。你可以通过setOnDismissListener()/setOnCancelListener()注册监听器OnDismissListener/OnCancelListener来监听search dialog的关闭. 当search dialog 关闭的时候,OnDismissListener就会被调用。OnCancelListener只是在用户显式的退出search dialog时, 才被调用,当用户执行搜索的时候并不会被调用(这种情况用户只是很自然的消失,并不取消).
如果当前 activity并不是我们所指定的 searchable activity, 那么当用户执行搜索的时候,普通的activity生命周期事件将被触发
(它将调用onPause(),被暂停). 然而,如果当前就是current activity指定的searchable activity的话,下面的两件事情将发生:
A,默认的话, searchable activity 将调用onCreate()来响应该ACTION_SEARCHintent ,然后这个activity的一个新实例将被放到activity stack。这时你的searchable activity就有两个实例在activity stack 中(如果按下BACK键,将回到前一个searchable activity实例,
而不是离开searchable activity).
B ,如果你把searchable activity的android:launchMode属性设置为了"singleTop", 那么searchable activity 将调用onNewIntent(Intent)来响应ACTION_SEARCH, 同时ACTION_SEARCHintent也是在这里被传入 .下面的示例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_DATABundle来携带你的数据。为了传送你的数据,请在要执行搜索请求的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()没被调用,一些个性化得操作就不能得到执行(比如上面例子的添加额外数据 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值