2013-06-29 2 views
1

У меня есть Activity A (Main) и Activity B.Android Back Stack - метод кнопки UP

Факт: Активность А имеет: android:launchMode="singleInstance"

Обычный сценарий:

  1. Пользователь запускает приложение>Activity A.
  2. Пользователь нажимает на пункт>Activity B

    3.A. Если пользователь нажмет на спине/вверх кнопки> Назад к A (без вызова Finish() на B)

    • Пользователь нажимает на тот же товар, как и раньше> Forth в B.
    • В этот момент он может идти туда и обратно без новых случаев. Это все в стеке, и оно не воссоздает действия. (Хорошо!)

    http://i41.tinypic.com/jkyuyg.jpg

    3.b. Если пользователь нажимает кнопку Home, затем переходит к задаче менеджера и приносит приложение к передней>Activity B (все хорошо, до сих пор)

    • Если пользователь нажимает кнопку UP, он идет к Диспетчеру Задач, и я хочу, чтобы перейти к Activity A (кнопка назад, как ожидается, будет работать таким образом, поэтому давайте сосредоточимся на кнопке UP).

Вот реализация я в Activity B для вверх и назад кнопки.

@Override 
public void onBackPressed() { 
    moveTaskToBack(true); 
    // I don't want to finish() the activity, so the user can reclick the same 
    // item without reloading the whole activity again (webview slow when parsing html). 
    return; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      moveTaskToBack(true); 
      // I don't want to finish() the activity... idem. 
      // I need to implement here the bring Activity A to front 
     break; 
    } 
} 

Итак, что я хочу: к «Назад», чтобы Activity A сохраняя ту же идею использования стека перезагрузить активность B, если это необходимо, без использования Intents (если это не вызывает активность на фронт, без добавления предметы в стек.)

Сообщите мне, если я объясню себя четко, и если вам нужна дополнительная информация.


UPDATE:

Я нашел это на: http://developer.android.com/training/implementing-navigation/ancestral.html

Это, как я приспособил его.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      Intent upIntent = new Intent(this, Activity_A.class); 
      if (NavUtils.shouldUpRecreateTask(this, upIntent)) { 
       TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities(); 
      } else { 
       moveTaskToBack(true); // I want it this way. Don't worry. 
      } 
     break; 
    } 
} 

Но метод NavUtils.shouldUpRecreateTask ВСЕГДА возвращает false.

Я сделал часть http://developer.android.com/training/implementing-navigation/ancestral.html#SpecifyParent, так что это не проблема.

Моя проблема в том, что я хочу узнать, существует ли в стеке Activity A, когда приложение запускается из диспетчера задач.

Как я могу это достичь? Спасибо.

+0

Почему бы не использовать панель действий http://developer.android.com/guide/topics/ui/actionbar.html. Также проверьте эту ссылку http://developer.android.com/design/patterns/navigation.html – Raghunandan

+0

Да, но я теряю функциональность «go go», которую я хочу сохранить, потому что это завершает «Активность B». – Dandy

+0

Я не понимаю, что значит «идти вперед»? – Raghunandan

ответ

1

moveTaskToBack перемещает всю задачу на задний план. он не завершает работу.

для того, чтобы иметь полный контроль над деятельностью, у вас есть несколько возможных решений:

  1. создать свой собственный глобальный менеджер по деятельности, следить за каждым из них через все их жизненного цикла и решить, что делать дальше каждое событие.

  2. Вы также можете закончить каждое действие, как только вы перейдете от него, и поместите его (только его имя или что-то) в стек и восстановите его состояние, когда вы вернетесь к нему.

  3. использовать фрагменты вместо этого и управлять ими все в одном действии. однако следует предупредить об изменениях конфигурации.

+0

Кажется, это хорошие подходы, но, к сожалению, я не могу начать все заново. Я использую moveTaskToBack, потому что я НЕ хочу завершить Activity B (на всякий случай пользователь сразу же нажимает на тот же элемент). Что было бы лучшим способом проверить, активна ли активность А (не завершена ОС)? – Dandy

+0

То, что пользователь ожидает, когда он нажимает на спину, это то, что текущий экран пойдет, и вы покажете ему предыдущий экран. для этого правила есть некоторые исключения, но это нормальный подход. отделочные работы также хорошо, поскольку каждый из них использует память, и вы не хотите, чтобы андроид закрывал ваше приложение из-за OOM, только потому, что пользователь переключился между действиями. вам лучше сохранить только минимальные вещи, которые вам нужны, и восстановить их, когда пользователь снова откроет активность. например, вы можете сохранить и resotre listView с использованием onSaveInstanceState и onRestoreInstanceState –