2012-03-02 2 views
4

Я ищу способ выйти из приложения Android в коде. Да, я знаю, я не должен был делать это, потому что андроид обрабатывает его, когда вы нажимаете кнопку «Назад», но у меня есть настроенный поток, который заставляет меня реализовать это. Я уже искал какое-то время и нашел несколько ответов:Лучший способ бросить приложение для Android?

  • Нельзя делать => Нет опции.
  • Call finish() в моей активности => Только для 1 активности, а не для всего приложения.
  • Запуск намерения для первого действия со специальным флагом => У меня есть несколько точек входа, поэтому не вариант.
  • Просто убейте мой собственный процесс => Не уверен в этом, вызовет ли он метод onDestroy() во всех действиях? И будут ли мои фоновые службы работать с этим? (Который не должен быть остановлен)

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

Так вот почему я задаю свой вопрос здесь, что является лучшим способом закрыть мое приложение?

Редактировать: Я более или менее исправил проблему. У меня есть список WeakReference моей деятельности. В каждом onCreate я добавляю активность в список. Затем, когда я хочу выйти из своего приложения, я просто перебираю список и вызываю finish(). Проблема: если список становится слишком большим, он не завершит все мои действия, так как андроид уже уничтожил их. Поэтому каждый раз, когда я точно знаю, что они мне больше не нужны, я заканчиваю их. В моем случае список не может превышать 3/4 действия, поэтому больше не нужно беспокоиться о том, что действия не будут закончены. Также с этим методом мне не нужно разрушать собственный процесс.

+0

Возможно, класс 'System' поможет (или эквивалент Android)? (Я не знаком с программированием на Android) – 11684

+2

Пожалуйста, прочитайте [это] (http://stackoverflow.com/questions/2033914/quitting-an-application-is-that-frowned-upon) – Ghost

+1

«У меня настроенный поток что заставляет меня реализовать это »- это ошибка в вашем приложении. Исправьте ошибку в своем приложении. – CommonsWare

ответ

3

Вы не должны делать это, но в любом случае, если вы настаиваете:

System.exit(0); 
+0

Это тоже способ, который я нашел, забыл об этом упоминании. Но проблема с этим заключается в том, что когда я снова открываю приложение, он будет воссоздавать действия, которые были открыты, когда я закрыл свое приложение. – Arne517

3

использование ниже кода.

android.os.Process.killProcess(android.os.Process.myPid()); 
    System.runFinalizersOnExit(true); 
+1

Мне было очень неприятно это делать (ранние версии Android с ошибками утечки ресурсов OpenGL, поэтому мне пришлось убить приложение между вызовами, чтобы заставить Android очистить). Я сделал это, используя 'android: process =" foo ", чтобы заставить это одно действие в свой собственный процесс, чтобы избежать убийства других действий, когда процесс умер, и использовал вышеуказанный код. Это действительно сработало. –

+0

И это будет называтьDestroy во всех открытых мероприятиях? И это не остановит мои текущие службы? – Arne517

+0

Все действия и службы, созданные в процессе, просто исчезнут, точно так же, как если бы Android запустил процесс из-за низкой памяти. Вот почему вам нужно использовать 'android: process', чтобы все, чего вы не хотели, убило жизнь в другом процессе. –

-1

Вы можете сохранить список всех начал свою деятельность в Список (использование WeakReference, чтобы избежать утечки памяти). Чтобы выйти из приложения, сначала вызовите метод завершения для каждого элемента, а затем вызовите android.os.Process.killProcess (android.os.Process.myPid());

+2

Ни один производственный код не должен использовать 'killProcess()'. – CommonsWare

+0

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

+0

@ Arne517 Вот почему вы должны закончить все действия сначала, а затем вызвать killProcess. Если вы их сначала закончите, они не будут воссозданы –

0

Не рекомендуется, но все же вы можете использовать это. Лучше пойти с этим решением, если вам нужно выйти из приложения.

По моему мнению, лучшее решение - это закончить каждое действие в вашем приложении, как показано ниже.

этап1) поддерживать статическую переменную в mainactivity say.

public static isQuit = false; 

этап2) при нажатии кнопки кнопки делает эту переменную равной true.

mainactivity.isQuit = true; 

этап3) И в каждом действии вашего приложения есть метод onrestart, как показано ниже.

@Override 
     protected void onRestart() { 
     // TODO Auto-generated method stub 
     super.onRestart(); 
     if(mainactivity.isQuit) 
      finish(); 
    } 
Смежные вопросы