Всегда ли нажатие кнопки Back приводит к завершению Activity ()? - PullRequest
16 голосов
/ 10 мая 2010

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

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

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

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

Ответы [ 7 ]

10 голосов
/ 10 мая 2010

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

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

Кроме того, вы можете настроить поведение при нажатии кнопки НАЗАД путем переопределения onBackPressed

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

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

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

5 голосов
/ 10 мая 2010

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

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

3 голосов
/ 06 апреля 2011

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

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);    
}
1 голос
/ 10 мая 2010

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

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

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

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

0 голосов
/ 22 февраля 2017

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

0 голосов
/ 14 июля 2014

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

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

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}
0 голосов
/ 04 июля 2010

Короткий ответ на оригинальный вопрос - «нет». Во многом это связано с тем, что, к сожалению, не каждый разработчик следует рекомендациям, на которые ссылаются предыдущие ответы.

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

...