Як не допустити повернення до попередньої діяльності?


210

Коли на телефоні натискається кнопка НАЗАД, я хочу запобігти тому, щоб певна активність повернулася до її попередньої.

Зокрема, у мене є екрани для входу та реєстрації, обидва починають нову діяльність, яка називається, HomeScreenколи відбувається успішне вхід / реєстрація. Після запуску HomeScreen я хочу не допустити, щоб користувачі могли повернутися до екранів для входу або реєстрації натисканням клавіші НАЗАД.

Я намагався використовувати Intent.FLAG_ACTIVITY_NO_HISTORY, але оскільки програма має інтеграцію у Facebook, коли використовується "Увійти з Facebook", Facebook повинен повернутися до початкового екрана входу, тому я повинен зберігати історію цих заходів.

Я думав змінити поведінку кнопки НАЗАД, HomeScreenщоб безпосередньо закінчити програму, коли натиснути кнопку, і я використав

@Override
public void onBackPressed() {
    finish();
}

але це також не працює.


1
Просто для уточнення, ви намагаєтеся зафіксувати поведінку назад для всіх, крім facebook?
havexz

2
У певному сенсі так, але насправді те, що я хочу - це після успішного входу в систему та відкриття HomeScreen, користувач не повинен мати змогу повертатися на екран входу, натискаючи кнопку НАЗАД. Так само, як, наприклад, Twitter або Foursquare, коли ми входимо в ці програми, ми не бачимо сторінку входу, поки не вийдемо (навіть якщо натиснути BACK після входу).
ecem

Відповіді:


345

Я б запропонував закінчити діяльність, яку ви не хочете, щоб користувачі поверталися назад. Наприклад, у вашій діяльності входу, одразу після дзвінка startActivity, дзвоніть finish(). Коли користувачі натиснуть кнопку "Назад", вони не зможуть перейти до активності входу, оскільки вона була вбита поза стеком.


2
Що робити, якщо я хотів би, щоб нитка в попередній діяльності продовжувала працювати?
AlleyOOP

2
Тоді ви б не хотіли йти з моїм підходом. Виклик закінчення () знищить активність. Чи можете ви почати процес, який ви хочете виконувати в тій діяльності, яку ви збираєтеся?
кодер

7
Примітка: якщо ви телефонуєте finishпід час спільного переходу, ви можете отримати кровотечу в попередній діяльності. наприклад, якщо у вас є HomeActivity-> IntermediateActivity-> FinalActivity, і ви дзвоните finish()в IntermediateActivityвідразу ж після запуску FinalActivityви побачите HomeActivityна короткий час.
Девід Мердок

101

Наступне рішення може бути досить корисним у звичайному сценарії входу / основної діяльності або в реалізації блокуючого екрана.

Щоб мінімізувати додаток, а не повертатися до попередньої активності, ви можете змінити його onBackPressed()так:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot)залишає ваш задній стек таким, яким він є, просто ставить ваше завдання (усі види діяльності) на задній план. Так само, як якщо б користувач натиснув кнопку "Головна" .

Параметр boolean nonRoot- якщо значення false, то це працює лише в тому випадку, якщо діяльність є коренем завдання; якщо це правда, він буде працювати для будь-якої діяльності у завданні.


3
Ідеально підходить для екрана входу, оскільки він зберігає історію недоторканою.
Хакмофорд

Дякую, я намагався знайти це близько трьох днів. Через android: noHistory = "true" прапор для Activity не працює так, як очікувалося (прапор noHistory відтворює активність після мінімізації) і закінчувати () іноді не працює для мене, але чому я все ще не розумію.
Деншов

37

Я не впевнений, що саме ви хочете, але це здається, що це має бути можливо, і це також звучить так, як ви вже на правильному шляху.

Ось декілька посилань, які можуть допомогти:

Вимкнути кнопку "назад" в Android

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

Як я можу відключити "повернення" до певної діяльності?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
Я не можу використовувати параметр noHistory через проблему Facebook, яку я намагався пояснити у своєму питанні, а також один із коментарів. Але річ із кнопкою НАЗАД не відключає її, а змушує її вийти з усієї програми, як System.exit(0)називається (я знаю, що це не найкращий мотив, але я просто хотів навести приклад).
ecem

Спасибі це спрацювало чудово. Тут я б тільки запропонував пропозицію, повернення не потрібно. Просто видаліть super.onBackPress (); і залиште метод порожнім. Це добре працює
гіперкодер

20

У вашому випадку є два рішення: діяльність A починає діяльність B, але ви не хочете повертатися до діяльності A у діяльності B.

1. Видалено попередню активність A із заднього стеку.

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. Відключена дія кнопки повернення в діяльності B.

Нижче наведено два способи запобігти тому, щоб повернути подію,

1) Рекомендувати підхід

@Override
public void onBackPressed() {
}

2 Перезазначити метод onKeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

Сподіваємось, що це корисно, але все ж залежить від ваших ситуацій.


3
Чи не поганий досвід користувачів для відключення onBackPress ()?
C. Skjerdal

Це повністю залежить від того, що ви намагаєтеся зробити, в функціональності додатків це потрібно, а потім піти на це.
користувач3099225

Дивно, як я повністю забув про перший метод використання finish(). Необхідно переоцінювати nohistoryатрибут, прапорці намірів, теги маніфесту батьківської діяльності тощо! Дурне, дякую за відповідь!
varun

8

Оскільки вже є багато запропонованих чудових рішень, я намагаюся дати більш роздумливе пояснення.

Як пропустити повернення до попередньої діяльності?

Видаліть попередню активність із Backstack. Простий

Як видалити попередню активність із Backstack?

Дзвінок finish()Метод

Нормальний потік:

введіть тут опис зображення
Усі дії зберігаються в стеку, відомому як Backstack.
Коли ви запускаєте нову активність ( startActivity(...)), то нова активність буде натиснута на вершину стека, а при натисканні кнопки "назад" активність вискакує зі стека.
Одним із ключових моментів, який слід зазначити, є те, що тоді натискаємо кнопку назадfinish(); метод викликується внутрішньо. Це поведінка за замовчуванням методу onBackPress ().

Тож якщо ви хочете пропустити Діяльність Б?

тобто A <--- C

Просто додайте finish();метод після вашої startActvity(...)діяльності в B

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

введіть тут опис зображення


6

finish()дає вам спосіб закрити поточну активність не для всієї програми. І вам краще не намагайтеся шукати методи вбивства програми. Маленька порада.

Ви пробували поєднання Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? Не забудьте використовувати ці прапори в Intentпочатковій діяльності!


2
FLAG_ACTIVITY_NO_HISTORYне дозволяє моєму LoginScreen фіксувати зворотний дзвінок Facebook, коли використовується Login з Facebook. Тому що, як тільки фокус виходить з екрана LoginScreen, його неможливо відновити (оскільки немає історії). Але я не пробував цього Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, перевірю, дякую!
ecem

також дякую про finish()метод, я про це не знав.
ecem

4

Покладіть finish()відразу після

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();

1
Це в основному те, що було сказано у прийнятій відповіді за чотири роки до цього.
TylerH

3

Відповідь paulsm4 є правильною. Якщо onBackPressed()ви просто повернетесь, він відключить кнопку назад. Однак я вважаю, що кращим підходом з огляду на ваш спосіб використання є перевернення логіки активності, тобто зробити домашню активність основною, перевірити, чи користувач там увійшов, якщо ні, запустити активність входу. Причина полягає в тому, що якщо ви перекриєте кнопку "назад" у своїй основній діяльності, більшість користувачів будуть розгублені, коли вони натискають назад, і ваш додаток нічого не робить.



3

Цей метод працює чудово

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

2

Просто перекрийте метод onKeyDown і перевірте, чи була натиснута кнопка "назад".

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

Коли ви створюєте, onBackPressed()просто видаліть, super.onBackPressed();і це повинно працювати


1

Покладіть

finish();

одразу після ActivityStart, щоб припинити діяльність, не даючи можливості повернутися до неї. Потім додайте

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

до тієї діяльності, яку ви починаєте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.