SearchView无意地启动可搜索的活动

时间:2016-02-11 17:27:25

标签: android android-intent searchview

我正在使用SearchView启动显示搜索结果的新活动。我遵循了以下来源:

新的可搜索活动ListActivity是从MainActivity中的应用栏内的SearchView小部件启动的。新的可搜索活动已启动,但缺少搜索意图(永远不会调用onNewIntent方法)。

Searchable.xml

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint" >
</searchable>

的AndroidManifest.xml

<application
    ...
    <meta-data
        android:name="android.app.default_searchable"
        android:value=".ui.ListActivity" />
    <activity
        android:name=".ui.MainActivity"
        ...
    </activity>
    <activity
        android:name=".ui.ListActivity"
        android:launchMode="singleTop"
        ...
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
    </activity>
</application>

MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // setSupportActionBar
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);    
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false); 
        return true;
    }
}

ListActivity

public class ListActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {    
        Log.d(TAG, "onCreate invoked");    //Log Printed
        ...
    }

    @Override
    protected void onNewIntent(Intent intent) {
        Log.d(TAG, "onNewIntent invoked");    //Log NOT Printed
    }
}

考虑到我还将getComponentName()替换为new ComponentName(this, ListActivity.class)但得到了相同的结果:没有错误,没有意图查询。

2 个答案:

答案 0 :(得分:3)

根据onNewIntent()'s documentation

  

对于在其包中将launchMode设置为“singleTop”的活动,或者如果客户端在调用FLAG_ACTIVITY_SINGLE_TOP时使用startActivity(Intent)标志,则调用此方法。在任何一种情况下,当在活动堆栈的顶部而不是正在启动的活动的新实例重新启动活动时,将在现有实例上使用用于重新启动的Intent调用onNewIntent()它

singleTop仅适用于活动(在您的情况下为ListActivity)位于顶部 - 而不是创建新实例,它将重用现有实例。但是,如果您只是从MainActivity搜索(在搜索后点击ListActivity),那么您正在销毁ListActivity实例,然后创建一个新实例 - 导致{{1被调用,但不是onCreate()

答案 1 :(得分:1)

不会为活动收到的“第一个”Intent调用getIntent方法。请查看文档http://developer.android.com/intl/es/reference/android/app/Activity.html#onNewIntent(android.content.Intent)

在您的情况下,您只需拨打onCreate中的@Override public void onCreate(Bundle savedInstanceState) { Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); } } 即可获取搜索查询:

form-data