android中search相关的activity到底如何跳转

读过了android developer上面关于search的那些指南,可是还有些疑问。

1 关于activity之间的关系

搜索涉及到两部分,用户输入和请求处理,那么我想知道用户输入所在的Activity和请求处理所在的Activity是同一个吗?

按照指南,配置搜索的步骤:

1)创建activity

       <activity
            android:name="com.app.maplite.activity.SearchActivity"
            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>

那么我想知道这个SearchActivity是作为用户输入Activity还是请求处理Activity的?

根据指南说的,系统接到search请求之后将相关数据放入intent然后发送到这个SearchActivity,看样子他是属于请求处理的,如果说是这样的话,那个meat-data要来何用?按照我的理解,meta-data这部分是用来定制搜索框展示情况的,这跟SearchActivity有个毛的关系?

根据我自己的测试,好像用户输入和请求处理必须在同一个Activity里面,如果这样的话,为什么要通过Intent这样的方法来传递搜索数据,这导致Activity的交互啊,真的很麻烦,是我理解有误还是怎么的?

2)我自己的代码有些问题,希望能解答一下。

    <activity
        android:name="com.app.activity.MapActivity"
        android:label="@string/title_activity_map"
        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>

Activity:

public class MapActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        handleIntent(getIntent());
    }

    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            Log.d("map", "do serach from new intent " + keyword);
            String keyword = intent.getStringExtra(SearchManager.QUERY);
            doSearch(keyword, null);
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
        handleIntent(intent);
    }

    private void doSearch(String keyword, String type) {
        Log.d("map", "do serach " + keyword);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.u_action_menu_map, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String key) {
                Log.d("map", "query test submit:" + key);
                doSearch(key, null);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String key) {
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

}

运行后,点击搜索“xx”后,会触发多次搜索事件,也就是说

Log.d("map", "do serach " + keyword);

会触发多次,问题我想就是由于Activity跳转引起的吧,但是不知道如何解决。

阅读 7.5k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题