Подтвердить что ты не робот

Удаление дополнительных функций из переданного 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.

Любые идеи?

4b9b3361

Ответ 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;
}