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 с использованием состояния сохранения экземпляра