Удаление дополнительных функций из переданного Intent
У меня есть экран поиска, который можно запустить, нажав на поле "имя" другого экрана.
Если пользователь следует этому документообороту, я добавляю дополнительный экземпляр Intent Extras, называемый "поиск" . Это дополнительно использует текст, заполняющий поле "имя" в качестве его значения. Когда экран поиска создается, этот дополнительный параметр используется в качестве параметра поиска, и поиск автоматически запускается для пользователя.
Однако, поскольку Android уничтожает и воссоздает действия, когда экран вращается, поворот телефона снова вызывает автоматический поиск. Из-за этого я хотел бы удалить "поиск" из действия "Действие", когда выполняется первоначальный поиск.
Я пробовал делать это так:
Bundle extras = getIntent().getExtras();
if (extras != null) {
if (extras.containsKey("search")) {
mFilter.setText(extras.getString("search"));
launchSearchThread(true);
extras.remove("search");
}
}
Однако это не работает. Если я снова поверну по экрану, дополнительный "поиск" все еще существует в Extension Activity Intent.
Любые идеи?
Ответы
Ответ 1
У меня есть работа.
Похоже, getExtras() создает копию дополнений Intent.
Если я использую следующую строку, это отлично работает:
getIntent().removeExtra("search");
Исходный код getExtras()
/**
* Retrieves a map of extended data from the intent.
*
* @return the map of all extras previously added with putExtra(),
* or null if none have been added.
*/
public Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
: null;
}
Ответ 2
Проблема может быть решена с использованием дополнительного флага, который является постоянным во время уничтожений и воссозданий. Вот суженный код:
boolean mProcessed;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
mProcessed = (null != state) && state.getBoolean("state-processed");
processIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
mProcessed = false;
processIntent(intent);
}
@Override
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putBoolean("state-processed", mProcessed);
}
protected void processIntent(Intent intent) {
// do your processing
mProcessed = true;
}