LaunchModes, singleTask: как переключаться между "экранами"? Является ли намерение единственным способом, и если так, я думаю, у меня есть проблема

В ряде вопросов (как этот) я изучал, как "менять экраны" в моем приложении. У меня есть "заголовок" сверху, с 4 кнопками. Каждая кнопка предназначена для замены "содержимого" (т.е. экрана изменения):

+--------------------+
| menu with buttons  |
+--------------------+
|                    |
|                    |
|  C O N T E N T     |
|                    |
|                    |
+--------------------+

Когда я нажимаю кнопку "Меню", я запускаю следующий код:

@Override
public void onClick(View v)
{
    Intent myIntent = new Intent(BaseActivity.this, ActivityMain.class);
    BaseActivity.this.startActivity(myIntent);
}

Как вы можете видеть, выполняется startActivity. Теперь, если я не укажу "launchMode" для Activity, это означает, что launchMode = normal. Если параметр startMode == нормальный, это означает, что активность будет воссоздаваться каждый раз при навигации по верхним кнопкам заголовка, а это означает, что все данные, введенные в "элементы формы", исчезли (или, по крайней мере, скрыты).

Итак, я нашел startMode "singleTask" , который выглядел как приятный. Если я добавлю этот режим запуска в свою активность, он не будет воссоздан, когда я перемещаюсь с помощью кнопок, сохраняя при этом состояние. Большой! Хорошо, пока я не прочитаю this:

Как отмечалось выше, не более одного экземпляра операции "singleTask" или "singleInstance", поэтому ожидается, что экземпляр будет обрабатывать все новые намерения.

Я обнаружил, что предложение означает, что может быть только одна активность, у которой параметр launchMode установлен на "singleTask" - если у меня больше одного, то это не будет работать (хотя ошибка компилятора).

Это означает, что я могу "сохранять состояние" только для одного действия при переключении между экранами (вперед и назад)

Еще раз, действительно ли это работает?

Ответ 1

Кажется, вы заставляете действия существовать там, где они не должны.

Если вы собираетесь использовать кнопки в качестве фальшивых вкладок, то должно быть одно действие, нет startActivity() вызовов и использовать ViewFlipper или FrameLayout или что-то изменить свой контент в соответствии с кнопкой. В конце концов, так работают вкладки, и только потому, что вы выбираете не использовать TabHost/TabActivity, а сворачиваете свою собственную систему вкладок, подход к дизайну должен быть одним и тем же.

Ответ 2

Как отмечалось выше, никогда больше чем один экземпляр "singleTask" или "singleInstance", так что экземпляр, как ожидается, будет обрабатывать все новые намерения.

означает один экземпляр действия, в котором вы задали свой "singleTask" или "singleInstance". если у вас есть два действия с этим параметром, это означает, что у вас есть только два экземпляра. в основном устанавливают его на столько действий, сколько вам нравится, пока вы понимаете, что делаете.

Ответ 3

Вы пытаетесь решить вашу проблему простым способом, но как насчет того, когда пользователь меняет ориентацию и ваша деятельность перезапускается? Разве это не уничтожит форму? Попробуй. Я думаю, вам нужно посмотреть на сохранение состояния формы в комплекте. С Android ваши действия должны предполагать, что их можно перезапустить в любое время. См. Ниже сообщение SO:

Сохранение состояния активности Android с использованием состояния сохранения экземпляра