Почему Intent.getAction() моей поисковой активности имеет значение null?

Я следил за документацией SearchManager, но все еще не могу сделать один из действия моего приложения доступны для поиска. Из моей активности появляется диалоговое окно «Поиск», я ввожу запрос, нажимаю «Поиск», моя активность снова открывается, затем я вижу это в журнале:

D/SearchDialog(  584): launching Intent { act=android.intent.action.SEARCH flg=0x10000000 cmp=com.clinkybot.geodroid2/.views.Waypoints (has extras) }
I/SearchDialog(  584): Starting (as ourselves) #Intent;action=android.intent.action.SEARCH;launchFlags=0x10000000;component=com.clinkybot.geodroid2/.views.Waypoints;S.user_query=sdaf;S.query=sdaf;end
I/ActivityManager(  584): Starting activity: Intent { act=android.intent.action.SEARCH flg=0x10000000 cmp=com.clinkybot.geodroid2/.views.Waypoints (has extras) }
D/WAYPOINTS( 1018): NI Intent { cmp=com.clinkybot.geodroid2/.views.Waypoints (has extras) }
D/WAYPOINTS( 1018): NI null
D/WAYPOINTS( 1018): NI false 

Мне кажется, что все в порядке до последних трех строк. Строки «NI» — это getIntent().toString(), getIntent().getAction() и getIntent().hasExtra(SearchManager.QUERY) соответственно.

ActivityManager, похоже, начинает мою деятельность с правильного действия. Затем, когда моя активность начинается, она не содержит никаких действий!? Что я делаю неправильно?

Соответствующая часть моего манифеста:

<activity android:name=".views.Waypoints" android:label="Waypoints" android:launchMode="singleTop">
   <intent-filter>
    <action android:name="android.intent.action.SEARCH" />
    <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>
   <meta-data android:name="android.app.searchable"
    android:resource="@xml/searchable" />
  </activity>

person originalbryan    schedule 25.04.2010    source источник


Ответы (1)


Это заняло слишком много часов моей жизни. При выполнении поиска из активности singleTop с возможностью поиска (в моем случае Waypoints) вы должны переопределить onNewIntent() и получить там поисковый запрос. Что я и делал через несколько часов. Уловка заключалась в том, что getIntent() не возвращает Intent, использованный для вызова активности (голова взрывается). Кажется, он возвращает исходное намерение, которое открыло мою доступную для поиска активность до того, как я выполнил свой первый поиск.

метод onNewIntent получает результаты поиска намерение. Я заменил getIntent() параметром из onNewIntent() и бум, прогресс.

Хотя я должен признать; выяснение этого облегчает разочарование от невозможности избежать звука Танцы со звездами, ревущего на заднем плане.

person originalbryan    schedule 27.04.2010
comment
Я рад, что нашел этот ТАК вопрос, прежде чем моя голова тоже взорвалась. Это упоминается в руководстве по основам приложения, но, черт возьми, было бы неплохо упомянуть onNewIntent в Intent#FLAG_ACTIVITY_SINGLE_TOP. а не только в Intent#FLAG_ACTIVITY_CLEAR_TOP. Более того, в документации для Activity#getIntent вообще ничего не упоминается!!! Тьфу... Как говорится, спасибо. - person brack; 07.01.2011
comment
Так что, возможно, было бы хорошей практикой всегда вызывать onNewIntent(getIntent()) из onCreate, просто чтобы вы знали, что он следует тому же пути кода. - person mclin; 27.01.2011
comment
ваша проблема описана здесь developer.android.com/guide/topics /search/ , однако даже после применения этого я все равно получаю null... - person max4ever; 01.06.2012