Как программно выйти из Android-приложения?

93

Я уверен, что этот вопрос задавали много раз, потому что я несколько раз читал. Мой клиент хочет, чтобы я поместил в его приложение кнопку, по которой пользователи могут щелкнуть и выйти. Я прочитал это и обнаружил, что звонок finish()сделает это. Но финиш - это только закрытие текущего бега, верно? У меня много действий, поэтому в этом случае я должен передать каждый экземпляр действия и завершить их или преобразовать каждое действие в шаблон Singleton.

Я также узнал, что Activity.moveTaskToBack(true)вы можете перейти на главный экран. Хорошо, это не закрытие, а фоновый процесс. Так это эффективно?

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

Лимонный сок
источник
почему бы не использовать панель действий. щелкните значок приложения, чтобы перейти на главный экран. нажмите кнопку возврата для выхода
Raghunandan
@Raghunandan: Как я уже сказал, требования клиента :(
Lemon Juice
Проверьте, помогает ли это android.os.Process.killProcess (android.os.Process.myPid ());
SANorton Stanley

Ответы:

71

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

Итак, ребята, друзья попробуйте этот код. Поместите этот код в событие onclick

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 
Фаяз
источник
8
На самом деле это не «полностью закрывает приложение», как просил PeakGen, поскольку приложение все еще работает, но это хорошая альтернатива
La masse
2
Я так не думаю , если действие началось с FLAG ACTIVITY NEW TASK , таким образом нельзя выйти из него
fozua
51

Вы можете вызвать System.exit (); уйти от всех занятий.

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });
Анчит Миттал
источник
5
Это как раз подводит меня к первому мероприятию
Lemon Juice
8
@AnchitMittal System.exit (1) не гарантирует сброс стеке активности или задачи (см developer.android.com/guide/components/... ). Таким образом, такой подход не гарантирует надлежащего завершения работы приложения (уничтожения всех действий) в надлежащее время.
Игорь Ганапольский
Не вся деятельность для выхода.
Jitendra
49

Метод finishAffinity, выпущенный в API 16, закрывает все текущие действия и закрывает приложение:

this.finishAffinity();

Завершите это действие, а также все действия, расположенные непосредственно под ним в текущей задаче, которые имеют такую ​​же привязку. Обычно это используется, когда приложение может быть запущено для другой задачи (например, из ACTION_VIEW типа контента, который он понимает), и пользователь использовал навигацию вверх, чтобы переключиться с текущей задачи на свою собственную. В этом случае, если пользователь перешел к каким-либо другим действиям второго приложения, все они должны быть удалены из исходной задачи как часть переключения задачи.

Обратите внимание, что эта отделка не позволяет вам доставить результаты для предыдущего действия, и если вы попытаетесь это сделать, будет выдано исключение.


Начиная с API 21 вы можете использовать:

finishAndRemoveTask();

Завершает все действия в этой задаче и удаляет ее из списка недавних задач.

Альтернативы:

getActivity().finish();
System.exit(0);


int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

Источник: Как выйти из приложения Android программно


Надеюсь, это поможет! Удачи!

Шрештх Харбанда
источник
2
Не используйте System.exit (). Android попытается перезапустить приложение после его выхода. Вы можете попасть в петлю.
AndroidDev
42

Если вы хотите выйти из приложения, используйте этот код внутри события нажатия кнопки:

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}
Пир Фахим Шах
источник
24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
Сай Адитья
источник
4
Чем отличается System.exit (1); и System.exit (0);
Pyae Phyo 06
System.exit (1) означает, что приложение завершилось с некоторой ошибкой, а System.exit (0) означает, что приложение завершилось без ошибок. Вот как различные команды linux / unix возвращают условия (ошибки) при выходе.
iOS-Coder
17

Это слишком просто. ИспользоватьSystem.exit(0);

Амон Олимов
источник
2
Ха-ха-ха. Не совсем так просто
TheRealChx101
13

Фактически возможны две ситуации:

  1. Возможно, вы захотите выйти из активности
  2. Или вы хотите выйти из приложения

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

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

Но это не убьет основные действия в том же приложении. Это просто минимизирует приложение.

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

android.os.Process.killProcess(android.os.Process.myPid()); 

для моно-разработки просто используйте

process.KillProcess(Process.MyPid());
Касун
источник
Mypid () - это ваш метод или что-то в этом роде ... Итак, как вы пишете Mypid ... вы должны писать с помощью метода .....
Amitsharma
@amitsharma MyPid () - это метод из класса Process, который возвращает идентификатор этого процесса, который можно использовать с killProcess (int) и sendSignal (int, int)
Касун
Остановит ли он фоновую службу и широковещательные приемники или просто безопасно закроет приложение?
Усман Рана
Итак, в чем разница между android.os.Process.killProcess(android.os.Process.myPid()); и process.KillProcess(Process.MyPid());?
DysaniazzZ
7

Как насчет this.finishAffinity()

Из документов,

Завершите это действие, а также все действия, расположенные непосредственно под ним в текущей задаче, которые имеют такую ​​же привязку. Обычно это используется, когда приложение может быть запущено для другой задачи (например, из ACTION_VIEW типа контента, который он понимает), и пользователь использовал навигацию вверх, чтобы переключиться с текущей задачи на свою собственную. В этом случае, если пользователь перешел к каким-либо другим действиям второго приложения, все они должны быть удалены из исходной задачи как часть переключения задачи. Обратите внимание, что эта отделка не позволяет вам доставить результаты для предыдущего действия, и если вы попытаетесь это сделать, будет выдано исключение.

Акешвар Джа
источник
6
android.os.Process.killProcess(android.os.Process.myPid());
Катир
источник
В моем случае это спасло мне жизнь. Спасибо!
Лифка
4

это очистит задачу (стек действий) и начнет новую задачу

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);
Махмуд Али
источник
Объясните, почему вы разместили этот код в качестве ответа и что он тоже делает.
М. Адил Халид
1
Добро пожаловать в Stack Overflow! Хотя вы, возможно, решили проблему этого пользователя, ответы, содержащие только код, не очень полезны для пользователей, которые зададут этот вопрос в будущем. Измените свой ответ, чтобы объяснить, почему ваш код решает исходную проблему.
Joe C
3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }
Азим Хан
источник
2

поместите это в свой onClic:

moveTaskToBack(true);
    finish()
Стэн Малкольм
источник
что не так с проголосовавшими против. Это ответ. У меня есть 2 действия, 1-е - активность входа, а 2-е - основная активность .... я хотел выйти из приложения в рамках основной активности и не хочу возвращаться к активности входа ... я вставляю этот ответ, и теперь я могу закрыть приложение в основной активности.
Азизи Муса,
если вы сделаете это, приложение все равно будет работать в фоновом режиме
Моханад Хаддадин,
Работает нормально. Мой случай: splashActivity запустить MainActivity. Когда пользователь снова нажимает кнопку MainActivity, приложение закрывается, как ожидалось. Все остальные случаи вернули меня к всплеску!
Jviaches
Что ж, вы должны были завершить действие входа в систему, как только вход завершился :) И ответ, конечно, не совсем правильный , movewTaskToBackничего не заканчивает, он просто скрывает приложение, и, finishкак упоминалось кем-то еще, завершает только текущий activity. Таким образом, он завершает текущую деятельность и скрывает остальное, если таковое имеется. В любом случае, он не должен получать голосование против только за это ...
Meow Cat 2012
2

Попробуйте это во время звонка. Иногда я использую его при нажатии кнопки.

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

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

прочтите этот вопрос для большей ясности android - код выхода из приложения

Риширадж Пурохит
источник
2

Используйте this.finishAffinity (); на этой кнопке вместо finish (); Если это не сработает, вы также можете попробовать, добавив android: noHistory = "true" в свой манифест, а затем завершить свою деятельность с помощью uisng finish (); или finishAffinity ();

Надеюсь, это поможет....:)

Йеша Шах
источник
2

Достижение в Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }
GONeale
источник
Это ссылка на System.Environment.Exit или Android.OS.Environment.Exit?
Moffen
2

Просто вызовите эти две функции

 finish();
 moveTaskToBack(true);
younes
источник
Ваш ответ пришел в сообщениях более низкого качества. Пожалуйста, дайте объяснение, даже если ваш код не требует пояснений.
Харша Бияни
2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

Используйте этот код, он очень полезен, и вы можете выйти из всех действий.

Абдул Кадир
источник
Я сделал это, а потом сбросил телефон с 5 этажа, все мероприятия закрыты спасибо
Пасхалис
1

Призрачная активность, вызываемая с помощью singletop и finish () в onCreate, должна помочь

Иисус
источник
1

Работает только с moveTaskToBack(true);

user3856297
источник
1

Вместо System.exit (1) просто используйте System.exit (0)

Казе Тдр
источник
1

Если кто-то все еще задается вопросом, для Xamarin.Android (в моем случае на нем также работает Monogame) команда FinishAndRemoveTask()on Activityвыполняет свою работу очень хорошо!

Конрад
источник
1

во фрагменте

getActivity (). finishAndRemoveTask ();

в деятельности

finishAndRemoveTask ();

Родриго Гивизьес
источник
0

просто используйте код в своей обратной печати

                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);
Sayooj
источник
0

Если вы используете EventBus (или любую другую библиотеку pub / sub) в своем приложении для связи между действиями, вы можете отправить им явное событие:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

Единственным недостатком этого является то, что вам нужно, чтобы все действия прослушивали это событие, чтобы вызвать их собственные finish(). Для этого вы можете легко создавать классы активности прокладки через наследование, которые просто прослушивают это событие и позволяют подклассам реализовывать все остальное, а затем убедитесь, что все ваши действия наследуются от этого дополнительного уровня. Слушатели kill могут даже добавить некоторые дополнительные функции с помощью переопределений, например, предотвращение смерти в определенных конкретных ситуациях.

Гжегож Адам Ханкевич
источник
0

Просто запустите следующие две строки, когда хотите выйти из приложения.

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
Хасснайн Джамиль
источник
0
finish();
 finishAffinity();
 System.exit(0);

работал на меня

прабху
источник
1
Пожалуйста, добавьте пояснения к вашему коду. Кроме того, похоже, что это уже было сказано в других ответах - так что вы также должны объяснить, что делает ваше решение лучше, чем другие,
Нико Хаасе
0

Просто назовите это:

finishAffinity();
Мухаммад Навид
источник
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность.
Игорь Ф.
0

Свяжите этот метод с вашей кнопкой выхода / выхода

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }
Сихат Афнан
источник
-1

Если вы используете и завершение, и выход, ваше приложение полностью закроется

финиш();

System.exit (0);

Абдулла Алкиш
источник