Как программно закрыть приложение
Вы можете использовать класс CoreApplication . Он предоставляет статический метод выхода:
Однако в документации указано следующее:
Примечание . Не используйте этот метод для завершения работы приложения вне сценариев тестирования или отладки.
К сожалению, причина этого осталась неизвестной.
Более того, вы можете использовать старомодный Application.Exit (нестатический):
Здесь также стоит взглянуть на примечания:
Используйте этот метод для предоставления пользовательского интерфейса, который позволяет пользователям выходить из вашего приложения. Однако обычно вы не должны предоставлять этот пользовательский интерфейс, потому что система автоматически управляет временем жизни приложения и завершает приостановленные приложения по мере необходимости для освобождения ресурсов.
tl; dr: Оба метода Exit завершат работу приложения, а не приостановят его. Вы должны спросить себя, действительно ли вы хотите совершить это действие.
Если вы хотите приостановить работу приложения вместо завершения, попробуйте использовать ApplicationView.TryConsolidateAsync() . Например, если приложение реализует только один ApplicationView , попробуйте вызвать ApplicationView.GetForCurrentView().TryConsolidateAsync() , чтобы закрыть приложение.
Очевидное преимущество этого метода заключается в том, что приложение закрывается так же, как вы это делаете, нажав кнопку закрытия в строке заголовка, закрытие происходит изящно, анимация такая же, и приложение приостанавливается, а не внезапно закрывается.
Кроме того, когда вы снова запускаете приложение после закрытия с помощью этого метода, приложение запускается в той же позиции и того же размера, что и при закрытии, при использовании Application.Current.Exit() и CoreApplication.Exit() не запускает приложение в той же позиции. и размер.
Это поддерживаемый способ выхода из приложения UWP:
Однако его можно использовать относительно редко. Внимательно изучите пользовательский интерфейс, связанный со сценарием, в котором вы будете использовать этот метод. Например, может быть оправдано программный выход из приложения, если срок действия какой-либо учетной записи истек или разрешения безопасности, управляемые удаленно, были отозваны. Редко бывает, что у вас есть собственная кнопка «Выход», расположенная в середине экрана, не противоречащая рекомендациям Windows.
Раньше вроде Close; работало - сейчас что-то перестало.
основной форме Close или где угодно Application.Terminate
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
ExitProcess, будучи функцией WinApi, не вызывает finalization модулей, вместо него лучше halt(0).
Возможно есть контрол у которого Name=Close .
Попробуйте писать так: Form1.Close .
I am the First of Cyber Evolution.
I am the First to Program your Future.
Значит Код смотреть нужно, может там потоки какие незавершаются правильно.
Действительно какой-то бардак.
Мне нужно закрыть приложение, если определенная папка уже существует
Сам код находится в отдельном модуле, не имеющим формы.
Пробовал все функции по отдельности и все вместе. Приложение закрывается после выполнения вызывающей процедуры. А нужно немедленно.
Как можно решить эту проблему?
Что нужно включить в предложение uses, чтобы функция EхitРrосеss распознавалась?
С уважением, Николай
Регулярная процедура procedure CheckAndCreateFolder() ничего не знает и не может знать ни о каких формах включая главную. Также она не может ничего знать о любых глобальных переменных объявленных в любом модуле проекта.
Если вам достаточно простого совета без объяснений, уберите из приведенного кода строки
Application.Terminate; всё сделает сам и грамотно.
В вопросе у меня есть строка "Пробовал все функции по отдельности и все вместе", и работают они одинаково: Сначала полностью выполняется код вызывающей процедуры, а затем программа закрывается без всяких дополнительных действий
Работа функции Application.Terminate отличается от других лишь тем, что модальное окно (S_folder) три раза "подмигивает", но программа не закрывается.
Регулярная процедура procedure CheckAndCreateFolder() ничего не знает и не может знать ни о каких формах включая главную. Также она не может ничего знать о любых глобальных переменных объявленных в любом модуле проекта. |
Это еще почему? Чем эта процедура хуже других?
Пока, если не будет найдено другого решения, я добавил глобальную переменную Bol:boolean. Если папка уже существует, то CheckAndCreateFolder устанавливает ее в true. В вызывающую процедуру, сразу после вызова CheckAndCreateFolde, добавил строку if Bol then exit. Теперь функции S_F.Close и Application.Terminate сразу закрывают приложение, а функция S_folder.Close - закрывает только модальную форму. Все, как и должно быть. Не люблю глобальные переменные, пытаюсь использовать их как можно меньше. Если есть другое решение, то подскажите.
С уважением, Николай.
Она не хуже и не лучше. Она живет в ином пространстве имён нежели стандартное Дельфи приложение. Она работает только с переменными переданными ей в качестве параметров и с её собственными локальными переменными.
Среди многих других. Ничего не работает.
ОТВЕТЫ
Ответ 1
Чтобы выйти из приложения, вы можете позвонить
Как описано в документации к Application.Shutdown , вы также можете изменить поведение выключения приложения, указав ShutdownMode:
- Когда ShutdownMode установлен на OnLastWindowClose.
- Когда для параметра ShutdownMode установлено значение OnMainWindowClose.
- Когда пользователь заканчивает сеанс, и событие SessionEnding либо необработанно, либо обрабатывается без отмены.
Также обратите внимание, что Application.Current.Shutdown(); может вызываться только из потока, создавшего объект Application , т.е. обычно основной поток.
Ответ 2
Если вам действительно нужно закрыть его, вы также можете использовать Environment.Exit(), но это совсем не изящно (больше похоже на завершение процесс).
Ответ 3
Как сказал wuminqi, Application.Current.Shutdown(); является необратимым, и я считаю, что он обычно используется для принудительного закрытия приложения, например, когда пользователь выходит из системы или выключает Windows. Вместо этого вызовите this.close() в главное окно. Это то же самое, что нажать "ALT-F4" или кнопку закрытия [x] в окне. Это приведет к закрытию всех остальных закрытых окон и вызовет вызов Application.Current.Shutdown(); , пока действие закрытия не будет отменено. См. Документацию MSDN на Закрытие окна.
Кроме того, поскольку this.close() можно отменить, вы можете поместить в диалог подтверждения изменений изменений в обработчик закрывающего события. Просто создайте обработчик событий для <Window Closing=". "> и измените e.Cancel соответственно. (Подробнее о том, как это сделать, см. документ MSDN
Ответ 4
Это должно сделать трюк:
Если вам интересно, вот некоторые дополнительные материалы, которые я нашел полезными:
Ответ 5
При необходимости используйте любое из следующих действий:
1.
2.
Прежде всего методы вызовут closing event класса Window , и выполнение может прекратиться в какой-то момент (так как обычно приложения ставят диалоги типа ) уверен? ' или' Вы хотите сохранить данные перед закрытием? ', прежде чем окно будет полностью закрыто)
3. Но если вы хотите немедленно закрыть приложение без предупреждения. Используйте ниже
Ответ 6
Не должно быть Application.ShutDown(); или .Exit().
Приложение представляет собой статический класс. Он не относится к текущему приложению Вам нужно перейти к текущему приложению, а затем закрыть его следующим образом:
Ответ 7
Вот как я делаю свое:
Я вызываю только Application.Current.ShutDown() из главного окна приложения, все остальные окна используют this.Close() . В моем главном окне Window_Closing(. ) обрабатывается верхняя правая кнопка x . Если какой-либо из методов вызывает приближение окна, Window_Closing(. ) захватывает событие для завершения, если пользователь подтверждает.
Я действительно использую Application.Current.ShutDown() в своем главном окне - это то, что я заметил, что если ошибка дизайна была сделана, и я не объявил родителя одного из моих окон в приложении, если это окно открывается без отображения перед последним активным закрытием окна, у меня осталось скрытое окно, работающее в фоновом режиме. Приложение не будет закрыто. Единственный способ предотвратить полную утечку памяти - это войти в диспетчер задач, чтобы закрыть приложение. Application.Current.ShutDown() защищает меня от непреднамеренных недостатков дизайна.
Это из моего личного опыта. В итоге используйте то, что лучше всего подходит для вашего сценария. Это всего лишь еще одна информация.
Я нашел некоторые коды для выхода из приложения Android программно. Вызов любого из следующего кода в onDestroy () полностью закроет приложение?
Я не хочу запускать приложение в фоновом режиме после нажатия кнопки «Выйти». Просьба предложить мне использовать любой из этих кодов для выхода из приложения? Если да, то какой код я могу использовать? Это хороший способ выйти из приложения в Android?
Начиная с API 16, вы можете использовать метод finishAffinity, который, кажется, довольно близок к закрытию всех связанных действий по его имени и описанию Javadoc:
Завершите это действие, а также все действия непосредственно под ним в текущей задаче, которые имеют ту же привязку. Это обычно используется, когда приложение может быть запущено для другой задачи (например, из ACTION_VIEW типа контента, который он понимает), и пользователь использовал навигацию вверх для переключения из текущей задачи в свою собственную. В этом случае, если пользователь перешел к другим действиям второго приложения, все они должны быть удалены из исходной задачи как часть переключения задачи.
Обратите внимание, что это завершение не позволяет вам доставлять результаты к предыдущему действию, и будет выдано исключение, если вы попытаетесь это сделать.
Начиная с API 21 вы можете использовать очень похожую команду
Определенно это правильный ответ! Это не хорошее решение, чтобы закончить использование приложения System.exit(0); . Спасибо за ваш ответ! Наконец-то я нашел достойное решение. Знаете ли вы, есть ли другое решение по API 14? Спасибо Вы можете завершить () каждое действие по отдельности, либо закрыв приложение, либо в жизненном цикле действия. Это решение работает в 99% случаев. Однако это не разрушит процесс, поэтому, например, Dagger не будет очищен. В тех редких случаях, когда требуется убить процесс, System.exit(0) это единственное решение, которое сработало для меня.Завершает все действия в этой задаче и удаляет ее из списка недавних задач.
это лучший способ выйти из приложения. .
Лучшее решение для меня.
да, отлично работает! Нужно позвонить в MainActivity, чтобы заставить его работать! Идеальное решение. Нет необходимости прерывать процесс, так как Android лучше знает управление памятью. Однако это обеспечивает решение для завершения действия, а также для выхода из приложения для удобства пользователя. Идеальное решение на самом деле. Исправлено много проблем. Спасибо. Я не думаю, что это хорошее решение. Вы не должны заканчивать свою программу, используя System.exit(0); . Правильное решение было опубликовано @sivi (его ответ выше) это не решение, оно не работает, если у вас есть стек действийЕсли вы будете использовать только finishAffinity(); без System.exit(0); приложения, оно будет закрыто, но выделенная память будет по-прежнему использоваться вашим телефоном, поэтому . если вы хотите, чтобы приложение было чистым и действительно вышло, используйте их оба.
Это самый простой метод, который работает где угодно, выйдите из приложения по-настоящему, у вас может быть много открытых действий, и все будет без проблем.
пример по нажатию кнопки
или если вы хотите что-то приятное, например, с диалоговым окном предупреждения с 3 кнопками ДА НЕТ и ОТМЕНА
если бы я использовал FCM или фоновые задачи в своем приложении, у меня не было бы проблем? Это было то, что мне нужно было стереть приложение из памяти Пожалуйста, не используйте. System.exit(0); Вы не должны освобождать эту память, система сделает это за вас, если потребуется. Это предполагаемое поведение.Пожалуйста, подумайте над тем, нужно ли вам убить приложение: почему бы не позволить ОС выяснить, где и когда освободить ресурсы?
В противном случае, если вы абсолютно уверены, используйте
Как реакция на комментарий @dave Appleton: во-первых, прочитайте большой комбо-вопрос @gabriel, опубликованный: « Не одобряется ли выход из приложения?
Теперь, предполагая, что у нас это есть, вопрос здесь по-прежнему имеет ответ: код, который вам нужен, если вы что-то делаете с выходом - это finish() . Очевидно, что вы можете иметь более одного вида деятельности и т. Д., Но это не главное. Позволяет управлять некоторыми из вариантов использования
- Вы хотите, чтобы пользователь прекратил все из-за использования памяти и «не работал в фоновом режиме?» Сомнительно. Позвольте пользователю остановить определенные действия в фоновом режиме, но позвольте ОС уничтожить все ненужные ресурсы.
- Вы хотите, чтобы пользователь не переходил к предыдущей активности вашего приложения? Ну, или настройте его так, чтобы он не работал, или вам нужна дополнительная опция. Если большую часть времени работает задняя часть = предыдущая активность, не будет ли пользователь просто нажать домой, если он / она хочет сделать что-то еще?
- Если вам нужен какой-то сброс, вы можете выяснить, было ли / как / и т.д. ваше приложение завершено, и если ваша активность снова сфокусировалась, вы можете принять меры, показав новый экран вместо того, чтобы перезапустить, где вы были.
Так что, в конце концов, конечно, finish() не убивает все, но это все еще инструмент, который вам нужен, я думаю. Если есть вариант «убить все действия», я его еще не нашел.
Звонок finish() не убьет приложение. finish() используется постоянно: Call this when your activity is done and should be closed. это тот же эффект, что и нажатие кнопки «назад». Готово убьет активность. чем это отличается от убийства приложения? Нет ничего плохого в том, чтобы «убить» или «убить» Activity (а не Application ). Например, вы можете начать новое действие, чтобы показать пользователю некоторую информацию. После тайм-аута или нажатия «ОК» вы можете позвонить, finish() чтобы вернуться к операции вызова. Большинство приложений Android имеют более одного вида деятельности.Я думаю, что приложение должно быть убито в некоторых случаях. Например, есть приложение, которое можно использовать только после входа в систему. У входа в систему есть две кнопки: «Войти» и «Отмена». Когда вы нажимаете кнопку «Отмена», это определенно означает «Завершить приложение». Никто не хочет приложение живым в фоновом режиме. Поэтому я согласен, что в некоторых случаях необходимо закрыть приложение.
Я полностью согласен с этим вариантом использования. Также обратите внимание на мое безопасное приложение, которое должно быть доступно в определенном месте и должно быть лучше закрыто, если пользователь не находится в этом месте. Что мне делать?Создайте ExitActivity и объявите это в декларации. И позвоните ExitActivity.exit(context) для выхода из приложения.
Это самый популярный ответ, но это взлом. Вызов функции end в onCreate будет выглядеть сбой на большинстве, если не на всех устройствах. Хм это взломать, но не глюк. Сначала вызовите метод exit (), он идет поверх всех действий с четким верхом и задачами, а затем завершается сам. здесь вы выходите. Не забудьте объявить этот класс в своем манифесте. +1 для умного взлома, хотя.В Android нет выхода из приложения , SampleActivity.this.finish (); завершит текущую деятельность.
При переходе от одного занятия к другому продолжайте заканчивать предыдущее
Прежде всего, этот подход требует минимального Api 16.
Я разделю это решение на 3 части, чтобы решить эту проблему более широко.
1. Если вы хотите выйти из приложения в Activity, используйте этот фрагмент кода:
2. Если вы хотите , чтобы выйти из приложения в , не активность класса , который имеет доступ к деятельности , то используйте этот код:
3. Если вы хотите выйти из приложения в классе, отличном от Activity, и не можете получить доступ к Activity, например Service, я рекомендую вам использовать BroadcastReceiver. Вы можете добавить этот подход ко всем своим действиям в вашем проекте.
Создайте переменные экземпляра LocalBroadcastManager и BroadcastReceiver. Вы можете заменить getPackageName () + ". Closeapp", если хотите.
Добавьте это к методу onCreate () Activity.
Вы можете использовать finishAndRemoveTask () из API 21
public void finishAndRemoveTask ()
Завершает все действия в этой задаче и удаляет ее из списка недавних задач.
Это зависит от того, как быстро вы хотите закрыть приложение.
Безопасный способ закрыть ваше приложение - finishAffinity ();
После закрытия всех процессов приложение закрывается. Это может занять некоторое время. Если вы закроете свое приложение таким образом и через короткое время перезапустите его, возможно, ваше новое приложение будет запущено в том же процессе. Со всеми незавершенными процессами и одиночными объектами старого приложения.
Если вы хотите быть уверены, что ваше приложение полностью закрыто, используйте System.exit (0);
Это немедленно закроет ваше приложение. Но возможно, что вы повредите файлы, которые открыты в вашем приложении, или редактирование общих настроек не завершится. Так что используйте это осторожно.
Если вы используете сторожевой таймер в сочетании с долгосрочным заданием, вы можете увидеть влияние различных методов.
Это убивает ваше приложение через 2 секунды без отображения диалога ANR или чего-то в этом роде. Если вы удалите System.exit (0) , запустите этот код и перезапустите приложение после его закрытия, вы увидите странное поведение, потому что бесконечный цикл все еще работает.
Вам лучше использовать, finish() если вы находитесь в Activity , или getActivity().finish() если вы в Fragment .
Если вы хотите полностью выйти из приложения, используйте:
Простой и простой способ выйти из приложения
Это просто приносит домашний экран или фактически убивает приложение?Мы хотим, чтобы код был надежным и простым. Это решение работает на старых устройствах и более новых устройствах.
Я думаю, что вы ищете это
Аналогично @MobileMateo, но в Котлине
Я не уверен, если это осуждается или нет, но это то, как я это делаю .
Шаг 1 - У меня обычно есть класс, который содержит методы и переменные, к которым я хочу получить глобальный доступ. В этом примере я назову это классом «App». Создайте статическую переменную Activity внутри класса для каждого действия, которое есть в вашем приложении. Затем создайте статический метод с именем «close», который будет запускать finish() метод для каждой из этих переменных Activity, если они НЕ равны NULL . Если у вас есть основное / родительское действие, закройте его последним:
Шаг 2 - в каждом из ваших действий, переопределение onStart() и onDestroy() методы. В onStart() , установите статическую переменную в вашем классе приложения равной " this ". В onDestroy() , установите его равным null . Например, в классе «Activity1»:
Шаг 3 - Если вы хотите закрыть свое приложение, просто позвоните App.close() из любой точки мира. Все созданные экземпляры будут закрыты! Так как вы только закрываете действия, а не убиваете само приложение (как в ваших примерах), Android может взять на себя эту задачу и выполнить любую необходимую очистку.
Опять же, я не знаю, будет ли это осуждено по любой причине. Если это так, я хотел бы прочитать комментарии о том, почему это так и как это можно улучшить!
Читайте также: