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

Нажатие Назад всегда приводит к завершению операции()?

Я слышал, что нажатие кнопки "назад" по существу приведет к тому, что текущая активность будет finish(). Это всегда так? Похоже, это было бы с тем, как он выдает Activity из стека.

Единственная ситуация, о которой я не очень уверен, - это то, когда корневая активность в задаче снова нажата. В настоящее время я испытываю очень странный эффект, описанный ниже:

При загрузке моего приложения первая операция предназначена для инициализации, и как только она заканчивается, она вызывает мою основную активность (TabActivity). В этом первом действии init есть андроид: noHistory = "true", установленный в манифесте, поэтому нажатие Назад из моей основной активности не вернется к этому. Он идет в Launcher. Когда я снова нажимаю на свое приложение в Launcher, операция инициализации снова загружается и загружает основное действие, когда это делается. Почти сразу после этого он загружает второй экземпляр моей основной деятельности. Но ТОЛЬКО после того, как приложение уже было запущено один раз, и было завершено нажатием BACK из основного Activity. Он делает это каждый последующий раз, пока я не выхожу из приложения или не загружаю новую версию из среды IDE.

Исходя из этого, я подозреваю, что какой-то экземпляр Activity находится вокруг и повторно используется, поскольку это происходит только во втором + времени, когда я запускаю приложение (и выйдите с BACK - с помощью HOME просто вернется в последнее состояние приложение, не имеет большого значения). У кого-нибудь есть мысли?

4b9b3361

Ответ 1

Я слышал, что нажатие кнопки "назад" по существу приведет к завершению текущего действия(). Это всегда так?

Нет, это не так. Большинство видов деятельности имеют такое поведение, но не все. Например, вы можете создать диалог и установить его setCancelable (false), и он не будет закрыт, если вы нажмете кнопку BACK.

Кроме того, вы можете настроить поведение активности на кнопке BACK нажатой путем переопределения onBackPressed

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

О поведении вашего приложения. Проверьте, завершена ли активация активности после того, как она загружает ваше основное действие? Я имею в виду, если вызывается метод onDestroy(). Возможно, после того, как он запустит основное действие, он останется там, и когда вы нажмете назад, вы просто вернетесь к старой Launcher...

надеюсь, что это поможет.

Ответ 2

Прочитайте Руководство по проектированию действий и задач на сайте разработчика Android; они объясняют, как работают кнопки "Главная" и "Назад". Очевидно, что если вы переопределите поведение по умолчанию (как упоминалось выше в hara), кнопка "Назад" не завершит действие.

По вашей конкретной проблеме проверьте свой логарифм. Вы должны быть в состоянии видеть, возвращается ли это старый процесс к жизни или запускает новый. Если это неясно, вставьте пару операторов журнала в onCreate, onPause, onDestroyed и т.д., Чтобы вы могли точно видеть, что происходит с вашим процессом.

Ответ 3

Вы можете управлять BACK-BUTTON, записав следующий код.

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        //preventing default implementation previous to 
        //android.os.Build.VERSION_CODES.ECLAIR
        return false;
    }     
    return super.onKeyDown(keyCode, event);    
}

Ответ 4

Работаете ли вы с любыми специальными флагами, такими как singleInstance или singleTop? Это может быть причиной странностей, которые вы видите. Самый простой способ отслеживать причину вашей проблемы - это полностью заполнить ее отладочными сообщениями. Например:

  • В вашей инициализации добавьте журнал в начало onCreate, чтобы получить имя активности, такого как this.toString(). Подробнее о том, почему вы хотите эту строку позже.
  • Когда он запускает основное действие с вкладками, получите имя запуска и сообщение о запуске закладки.
  • Переопределите обратные вызовы onPause(), onStop() и onDestroy() и добавьте строки отладки с this.toString(), а также сообщение, сообщающее вам, какой обратный вызов это.

Что это будет делать, это сказать вам, есть ли у вас несколько экземпляров активности инициализации. К этому, сравнивая название действий, вызывающих ваше основное действие, с теми, которые были только что созданы, и теми, которые прошли через onDestroy.

Если вы не знаете, как отлаживать, используйте Log.d(LOG_TAG, "Your message here");. А затем определите константу LOG_TAG String где-нибудь. После этого покажите перспективу LogCat в Eclispe, перейдя в Window, покажите перспективу (или просмотрите, не помните точно), другие, Android, LogCat. Цель константы LOG_TAG состоит в том, что вы можете настроить LogCat для фильтрации на эту строку и показывать только эти сообщения. Это упростит их просмотр среди массы сообщений системного журнала.

Ответ 5

Короткий ответ на исходный вопрос - "нет". Это во многом потому, что, к сожалению, не каждый разработчик следует рекомендациям, на которые ссылаются предыдущие ответы.

Однако сами направляющие упоминают исключения, когда клавиша "Назад" не должна называть финиш(). наиболее заметным исключением является веб-браузер, у которого есть свой "задний стек" для каждого окна, поэтому он должен иметь собственную пользовательскую обработку клавиши "Назад".

Ответ 6

Если на заднем стекле нет фрагментов, и разработчик не переопределил onBackPressed, действие завершится при нажатии кнопки "Назад".

Вот исходный код для Android 4.4.2 Activity.onBackPressed():

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

Ответ 7

просто переопределить onbackpressed().. на задней панели нажмите этот метод, чтобы получить выполнение удалить супер и делать то, что вы хотите сделать.