Как программно выйти из 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


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 типа контента, который он понимает), и пользователь использовал навигацию вверх, чтобы переключиться с текущей задачи на свою собственную. В этом случае, если пользователь перешел к каким-либо другим действиям второго приложения, все они должны быть удалены из исходной задачи как часть переключения задачи. Обратите внимание, что эта отделка не позволяет вам доставить результаты для предыдущего действия, и если вы попытаетесь это сделать, будет выдано исключение.



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);
    }

Это ссылка на System.Environment.Exit или Android.OS.Environment.Exit?
Moffen

2

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

 finish();
 moveTaskToBack(true);

Ваш ответ пришел в сообщениях более низкого качества. Пожалуйста, дайте объяснение, даже если ваш код не требует пояснений.
Харша Бияни

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

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



0

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

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

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);

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.