注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

Searchable(四)  

2011-05-11 18:30:26|  分类: 开发专题 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

  评论这张
 
阅读(799)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017