Закройте приложение и запустите домашний экран на Android - PullRequest
75 голосов
/ 11 января 2010

У меня есть два разных вида деятельности. Первый запускает второй. Во втором упражнении я вызываю System.exit(0), чтобы принудительно закрыть приложение, но первое действие автоматически отображается вместо возврата приложения на начальный экран. Как я могу избежать этого и заставить приложение вернуться на домашний экран?

Ответы [ 21 ]

88 голосов
/ 11 января 2010

Краткий ответ: вызов moveTaskToBack(true) на вашем Activity вместо System.exit(). Это будет скрывать ваше приложение, пока пользователь не захочет использовать его снова.

Более длинный ответ начинается с другого вопроса: почему вы хотите убить ваше приложение?

ОС Android управляет управлением памятью и процессами и т. Д., Поэтому мой совет - просто позвольте Android позаботиться об этом за вас. Если пользователь хочет покинуть ваше приложение, он может нажать кнопку «Домой», и ваше приложение фактически исчезнет. Если телефону понадобится больше памяти, ОС прекратит работу вашего приложения.

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

Так что, если вы хотите скрыть приложение, позвоните moveTaskToBack() и пусть Android решит, когда его убить.

53 голосов
/ 19 января 2011

Самый простой способ для достижения этой цели приведен ниже (без влияния на собственное управление памятью в Android. Нет необходимости в уничтожении процессов).

  1. Запустить действие, используя это намерение:

    Intent intent = new Intent(this, FinActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    finish();
    
  2. В целевом мероприятии FinActivity.class вызовите финиш () в onCreate.

Объясненные шаги:

  1. Вы создаете намерение, которое стирает все остальные действия (FLAG_ACTIVITY_CLEAR_TOP), и удаляете текущее действие.

  2. Деятельность уничтожает себя. Альтернативой является то, что вы можете сделать заставку в FinActivity. Это необязательно.

45 голосов
/ 11 января 2010

Вы должны подумать о том, чтобы не выходить из приложения. Это не то, как приложения Android обычно работают.

20 голосов
/ 18 февраля 2011

Android имеет механизм для безопасного закрытия приложения в соответствии с его документацией.В последнем действии, которое было завершено (обычно это основное действие, которое впервые возникло при запуске приложения), просто поместите пару строк в метод onDestroy ().Вызов System.runFinalizersOnExit (true) гарантирует, что все объекты будут завершены и сборщик мусора при выходе из приложения.Например:

public void onDestroy() {
    super.onDestroy();

    /*
     * Notify the system to finalize and collect all objects of the
     * application on exit so that the process running the application can
     * be killed by the system without causing issues. NOTE: If this is set
     * to true then the process will not be killed until all of its threads
     * have closed.
     */
    System.runFinalizersOnExit(true);

    /*
     * Force the system to close the application down completely instead of
     * retaining it in the background. The process that runs the application
     * will be killed. The application will be completely created as a new
     * application in a new process if the user starts the application
     * again.
     */
    System.exit(0);
}

Наконец, Android не будет уведомлять приложение о событии клавиши HOME , поэтому вы не можете закрыть приложение, когда нажата клавиша HOME .Android резервирует ключевое событие HOME для себя, чтобы разработчик не мог запретить пользователям выходить из приложения.

9 голосов
/ 15 апреля 2011

Я использую этот метод, чтобы закрыть Действия!

public static void closeAllBelowActivities(Activity current) {
    boolean flag = true;
    Activity below = current.getParent();
    if (below == null)
        return;
    System.out.println("Below Parent: " + below.getClass());
    while (flag) {
        Activity temp = below;
        try {
            below = temp.getParent();
            temp.finish();
        } catch (Exception e) {
            flag = false;
        }
    }
}
9 голосов
/ 11 января 2010

Вы также можете указать noHistory = "true" в теге для первого действия или завершить первое действие, как только вы начнете второе (как сказал Дэвид).

AFAIK, «принудительное закрытие» убивает процесс, в котором размещена JVM, в которой выполняется ваше приложение, и System.exit () завершает JVM, на которой выполняется экземпляр вашего приложения. Оба являются формой резких завершений и не рекомендуется для нормального потока приложения.

Так же, как перехват исключений для охвата логических потоков, которые может выполнять программа, не рекомендуется.

8 голосов
/ 11 января 2010

Когда вы запускаете второе действие, finish() сразу первое:

startActivity(new Intent(...));
finish();
6 голосов
/ 15 июня 2010

android.os.Process.killProcess(android.os.Process.myPid()); работает нормально, но рекомендуется позволить платформе Android беспокоиться об управлении памятью: -)

4 голосов
/ 17 ноября 2010

Используйте метод finish. Это более простой и легкий способ.

this.finish();
4 голосов
/ 11 января 2010

Вы не можете сделать System.exit (), это не безопасно.

Вы можете сделать это: Process.killProcess (Process.myPid ());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...