Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android Searchable之四

Android Searchable之四

編輯:Android開發實例

七、search dialog對Activity生命周期的影響

search dialog 只是一個浮動在屏幕上的 Dialog。它並不引起Activity棧的任何改變。 所以當search dialog 被啟動的時候, 並不會有生命周期函數被調動(比如onPause())。你的activity只是失去輸入焦點,因為輸入焦點被轉移到了search dialog. 如果你想在啟動search dialog的時候被notified,那麼請重寫Activity的onSearchRequested()方法.  當系統調用該方法的時候,說明你的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_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()沒被調用,一些個性化得操作就不能得到執行(比如上面例子的添加額外數據)

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved