2011-01-26 74 views
2

我有一個MapActivity,當按下搜索按鈕時將顯示Android搜索框。 SearchManager管理對話框,並將用戶的查詢傳遞給可搜索的活動,該活動搜索SQLite數據庫並使用自定義適配器顯示結果。Android onSearchRequested()回調到調用活動

這工作正常 - 我從數據庫顯示正確的結果。

但是,我想要做的是在用戶單擊搜索結果時,將結果顯示在地圖上的MapActivity中。目前,這意味着啓動一個新的MapActivity,使用Bundle傳遞搜索結果。

我曾想過更簡潔的方法是將搜索結果傳遞迴原始活動,而不是開始新的活動。目前,我的活動堆棧進入MapAct - > SearchManager - >搜索結果 - >新建MapAct。這意味着從新的MapAct中按「返回」將返回到查詢結果,然後返回到原始的MapAct。

似乎在搜索結果中,調用finish()不會導致在調用MapActivity中調用onActivityResult。

任何想法如何得到這個回調並保持一個合理的活動堆棧?

回答

5

我一直在挖掘這個確切問題的答案,並最終找到了一些可行的方法。我不得不做出原始調用活動可搜索的活動,所以我在清單條目是這樣的:

<activity android:name=".BaseActivity" 
      android:launchMode="singleTop"> 
    <!-- BaseActivity is also the searchable activity --> 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data android:name="android.app.searchable" 
       android:resource="@xml/searchable"/> 
    <!-- enable the base activity to send searches to itself --> 
    <meta-data android:name="android.app.default_searchable" 
       android:value=".BaseActivity" /> 
</activity> 

然後,而不是與真正的搜索活動搜索在這個活動中,手動startActivityForResult,這然後將允許您將setResultfinish回覆到原來的通話活動。

我在blog post here中瞭解了更多細節。

1

我終於發現了一個不涉及singleTop的解決方案。

首先,在你的活動,源於搜索,覆蓋startActivityForResult:

@Override 
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     int flags = intent.getFlags(); 
     // We have to clear this bit (which search automatically sets) otherwise startActivityForResult will never work 
     flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK; 
     intent.setFlags(flags); 
     // We override the requestCode (which will be -1 initially) 
     // with a constant of ours. 
     requestCode = AppConstants.ACTION_SEARCH_REQUEST_CODE; 
    } 
    super.startActivityForResult(intent, requestCode, options); 
} 

Android將永遠(出於某種原因)與Intent.FLAG_ACTIVITY_NEW_TASK標誌啓動ACTION_SEARCH意圖,出於某種原因,但如果該標誌是設置,onActivityResult將永遠不會(正確)在您的原始任務中調用。

接下來,在您的可搜索Activity中,您只需在用戶選擇某個項目時調用setResult(Intent.RESULT_OK, resultBundle)即可。

最後,你實現你的原始活動onActivityResult(int requestCode, int resultCode, Intent data)resultCodeIntent.RESULT_OKrequestCode是你請求的代碼不變(AppConstants.ACTION_SEARCH_REQUEST_CODE在這種情況下)作出適當的反應。