Как вывести текущую активность на домашний экран (без использования кнопки «Домой»)? - PullRequest
1 голос
/ 03 мая 2010

Я уверен, что на этот вопрос ответят, но я не смог его найти. Поэтому, пожалуйста, извините мою избыточность.

Я пытаюсь эмулировать кнопку «Домой», которая возвращает вас на домашний экран Android. Вот что вызывает у меня проблемы:

  • У меня есть 3 вида запуска. Первый (который связан со значком домашнего экрана) - это просто (защищенный паролем) процесс настройки. Он не будет использоваться пользователем (просто администратором)
  • Один из двух других (доступ к которым осуществляется через виджет приложения) - это приложение для анкетирования. Я позволяю переходить назад между вопросами с помощью кнопки «Назад» или кнопки «Назад» в графическом интерфейсе. Когда вопросник закончен, я суммирую полученные ответы и предоставляю кнопку «Готово», которая возвращает пользователя на начальный экран.

В приложении для анкетирования я использую одно действие (называемое ItemActivity), которое вызывает себя (это тоже рекурсия при использовании намерений?) Для перехода от одного вопроса к другому:

Questionnaire.serializeToXML();  
Intent i = new Intent().setClass(c, ItemActivity.class);  
if(Questionnaire.instance.getCurrentItemNo() == Questionnaire.instance.getAmountOfItems()) {  
    Questionnaire.instance.setCompleted(true);  
} else Questionnaire.instance.nextItem();  
startActivity(i);

На последнем экране отображается что-то вроде «Спасибо за участие», а также ранее описанная кнопка, которая должна вернуться на домашний экран. Но я не совсем понимаю, как правильно выйти из Деятельности. Я, например, использовал this.finish();, но это странным образом снова вызывает экран «Спасибо». Так как я могу просто выйти, прыгнув обратно на рабочий стол ??

Приносим извинения за неудобства.
С уважением,
Стеф

1 Ответ

8 голосов
/ 03 мая 2010

Похоже, что у вас открыто несколько копий ваших действий одновременно. Каждый раз, когда вы запускаете новый экземпляр действия, вы просто добавляете новые в стек - все старые действия все еще там. Когда вы звоните this.finish(), он просто показывает вам следующее последнее открытое действие. Я не уверен, почему это экран «Спасибо», так как, по-видимому, он открывается только в конце, но тогда я не полностью следую последовательности, в которой ваши действия вызываются.

То, что вы можете попытаться сделать, чтобы это исправить, это либо: 1) использовать finish() каждый раз после начала нового действия для другого вопроса (чтобы одновременно был открыт только один вид деятельности), либо 2) посмотрите, можете ли вы использовать флаг намерения CLEAR_TOP. Это запускает целевую активность, убивая все, что могло быть над ней в стеке. Например, если у вас есть действия: A, B, C, C, C, C, C (и т. Д. Для каждого вопроса), то запуск A с CLEAR_TOP уничтожит все экземпляры B и C. Вы можете встроить это в структуру вашей программы изменяя первый экран, пользователь видит, когда он запускает анкету. По умолчанию будет отображаться «приветственное» сообщение с кнопкой для запуска анкеты. Однако, если он начинается с определенного значения, связанного с намерением, он отображает сообщение «Спасибо».

Если вы сделаете это, то после выполнения finish() действия A пользователь вернется туда, где он был до того, как запустил ваше приложение - предположительно, на домашний экран, если он запускается с виджетом приложения.

...