Подтвердить что ты не робот

Закрыть приложение для Android

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

4b9b3361

Ответ 1

Да - почему, тогда как (вроде):

Короткий ответ:

System.exit(0);

Это красиво и чисто завершает работу всей java-машины, предназначенной для запуска приложения. Однако вы должны сделать это из основного действия, иначе Android может автоматически перезапустить приложение. (Протестировано на Android 7.0)

Подробности и объяснение того, почему это хороший вопрос, и у программиста может быть очень законная причина прекратить свое приложение таким образом:

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

Хорошее - это дружеское напоминание начинающим, что на Android вам не нужно беспокоиться о закрытии приложения, но некоторые люди действительно хотят прекратить свое приложение, даже если они знают, что им не нужно - и их вопрос о том, как это сделать, является законным вопросом с правильным ответом.

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

Дело в том, что даже с андроидом он по-прежнему является компьютером и на компьютере все еще запущен код, и совершенно понятно, почему кто-то может захотеть по-настоящему выйти из своего "приложения" (т.е. всех видов деятельности и ресурсов, принадлежащих к их приложению.)

Правда, разработчики в Google разработали систему, в которой, по их мнению, никому не понадобится выходить из своего приложения. И, может быть, в 99% случаев они правы!

Но одна из удивительных вещей, позволяющая миллионам программистов писать код для платформы, состоит в том, что некоторые из них попытаются подтолкнуть платформу к своим пределам, чтобы делать потрясающие вещи! - Включая вещи, о которых разработчики Android даже не мечтали!

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

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

НО: Помните, что отличные приложения не начинаются как прекрасные приложения! Они начинаются как едва работающие приложения и растут, чтобы стать подходящими идеальными приложениями.

Итак, я обнаружил, что мое приложение для тестирования аудио осциллографа отлично работает, пока я не нажал кнопку Android Home. Когда я снова запустил приложение для осциллографа, больше не было звука.

Сначала я бы Settings->Applications->Manage Applications->AppName->Force Stop.

(Обратите внимание: если текущий процесс linux не запущен, кнопка Force Stop будет отключена. Если кнопка включена, процесс Linux все еще запущен!)

Затем я мог повторно запустить приложение, и он снова работал.

Сначала я просто использовал деление на ноль, чтобы свернуть его - и это сработало отлично. Но я решил искать лучший способ - который приземлился на меня здесь!

Итак, вот как я пытался и что узнал:

Фон: Android работает на Linux. У Linux есть процессы и идентификаторы процессов (PID), как и Windows, только лучше. Чтобы узнать, какие процессы выполняются на вашем Android-устройстве (с подключением к USB-порту и т.д.), Запустите adb shell top, и вы получите список обновлений всех процессов, выполняющихся в Linux под андроидом.

Если у вас есть Linux на ПК, вы можете ввести

adb shell top | egrep -i '(User|PID|MyFirstApp)' --line-buffered

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

(как и диспетчер задач/список процессов в Windows)

Или если вы хотите увидеть только запущенные приложения:

adb shell top | egrep -i '(User|PID|app_)' --line-buffered

Вы также можете убить любое приложение на своем устройстве, запустив adb shell kill 12345 где 12345 - это номер PID.

Из того, что я могу сказать, каждое однопотоковое приложение просто использует один процесс Linux.

Итак, я узнал, что (конечно), если я просто активирую параметр Android Home, мое приложение продолжает работать. И если я использую Activity.finish(), он все равно оставит процесс запущенным. Деление на ноль определенно завершает процесс linux, который работает. Убийство PID из приложения кажется самым приятным до сих пор, которое я нашел, по крайней мере, для целей отладки.

Сначала я решил, что хочу убить мое приложение, добавив кнопку, которая приведет к делению на ноль, как это в моем MainActivity.java:

public void exit(View view)
{
    int x;
    x=1/0;
}

Затем в моей секции XML файла для этой кнопки я просто установил android: onClick = "exit".

Конечно, деление на ноль беспорядочно, потому что оно всегда отображает "Это приложение остановлено..." или что-то еще.

Итак, я попробовал финиш, вот так:

public void exit(View view)
{
    finish();
}

И это заставило приложение исчезнуть с экрана, но оно все еще работает в фоновом режиме.

Затем я попытался:

public void exit(View view)
{
      android.os.Process.killProcess(android.os.Process.myPid());
}

Пока это лучшее решение, которое я пробовал.

UPDATE: это то же самое, что и выше, поскольку он мгновенно завершает процесс Linux и все потоки для приложения:

public void exit(View view)
{
      System.exit(0);
}

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

Вся память, используемая приложением, будет освобождена. (Примечание. Фактически вы можете установить параметры в файле манифеста, чтобы заставить разные потоки запускаться в разных Linux-процессах, поэтому становится более сложным.)

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

EDIT: вот отличная ссылка для чтения по теме: http://developer.android.com/guide/components/fundamentals.html В нем объясняется, как каждое приложение работает на собственной виртуальной машине, и каждая виртуальная машина работает под своим собственным идентификатором пользователя.

Вот еще одна отличная ссылка, в которой объясняется, как (пока не указано иное в манифесте) приложение и все его потоки выполняются в одном Linux-процессе: http://developer.android.com/guide/components/processes-and-threads.html

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

(К мгновению я имею в виду ASAP - не позже всякий раз, когда необходим ram.)

PS: Вы когда-нибудь задумывались, почему вы идете, чтобы ответить на свой Android-телефон или запустить свое любимое приложение, и он замерзает на секунду? Вы когда-нибудь перезагружались, потому что устали от этого? Вероятно, из-за всех приложений, которые вы запускали на прошлой неделе, и подумали, что вы ушли, но все еще болтаетесь с памятью. Телефон убивает их, когда ему требуется больше памяти, вызывая задержку перед любым действием, которое вы хотели сделать!

Обновление для Android 4/Gingerbread: применяется то же, что указано выше, за исключением случаев, когда приложение выходит из строя или вылетает из строя, и весь процесс его работы в виртуальной машине Java продолжается, но в диспетчере приложений он работает, и у вас все еще есть "принудительно закрыть" или что бы то ни было. 4.0 должен иметь независимый список приложений, которые, по его мнению, работают, а не проверяет, действительно ли приложение работает.

Ответ 3

Вы можете закрыть свое Android-приложение, вызвав System.exit(0).

Ответ 4

просто вызовите функцию finish() в методе, в котором вы хотели бы завершить действие, например, когда вы используете метод onCreate(), в конце метода просто добавьте finish(), и вы увидите активность заканчивается, как только он создается!

Ответ 5

Как мне известно, функция завершения закрывает только текущий отображаемый экран.

Обратитесь к пример (где см. ответ, заданный "plusminus" ), он обязательно поможет закрыть ваше приложение.

Ответ 6

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

Этот код убивает процесс из ОС Использование этого кода нарушает работу ОС. Поэтому я бы рекомендовал вам использовать приведенный ниже код

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

Ответ 7

Прежде чем это сделать, пожалуйста, прочитайте еще один question:

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

Ответ 8

не однострочное решение, но довольно легко:

Подкласс класса, затем переопределите и добавьте метод finish() в метод onPause()

таким образом, активность исчезнет, ​​когда она войдет в фоновый режим, поэтому приложение не будет содержать стек действий, вы можете закончить() текущую активность, и приложение исчезло!

Ответ 9

Если вы закрываете основное действие с помощью Activity.finish(), я думаю, что он закроет все действия. Возможно, вы можете переопределить функцию по умолчанию и реализовать ее статическим образом, я не уверен, что

Ответ 10

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

Тем не менее, вы должны, вероятно, прочитать этот ответ.

Ответ 11

Ответ зависит от того, что вы подразумеваете под "закрытым приложением". В андроидских терминах это либо об "активности", либо группе действий во временном/предковском порядке, называемом "задача".

Конечная активность: просто вызовите finish()

Конечная задача:

  • очистить активность task-stack
  • перейти к корневой активности
  • а затем завершите его.

Это закончит всю "задачу"

Ответ 12

Это одно из самых бесполезных желаний начинающих разработчиков Android, и, к сожалению, оно очень популярно. Как вы определяете "закрыть" приложение для Android? Скрыть его пользовательский интерфейс? Прерывать фоновые работы? Прекратить обработку трансляций?

Приложения для Android представляют собой набор модулей, входящих в пакет .apk и подвергающихся воздействию системы через AndroidManifest.xml. Действия могут быть организованы и перегруппированы через разные стеки задач, а финишная обработка или любое другое перемещение от одного действия могут означать совершенно разные вещи в разных ситуациях. Одно приложение может запускаться внутри нескольких процессов, поэтому нет необходимости убивать один процесс, так как код приложения не будет работать. И, наконец, BroadcastReceivers могут быть вызваны системой в любое время, воссоздавая необходимые процессы, если они не запущены.

Главное, чтобы вы не нуждались в, чтобы остановить/убить/закрыть/независимо от вашего приложения через одну строку кода. Это означает, что вы пропустили какой-то важный момент в разработке Android. Если по какой-то причудливой причине вам нужно это сделать, вам нужно закончить() все действия, остановить все службы и отключить все BroadcastReceivers, объявленные в AndroidManifest.xml. Это не одна строка кода и, возможно, запуск Activity, который удаляет ваше собственное приложение, улучшит работу.