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

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

Ответы [ 21 ]

4 голосов
/ 05 мая 2012

Я использую это:

1) Родительское действие вызывает вторичное действие с помощью метода "startActivityForResult"

2) В дополнительном действии, когда закрытие:

int exitCode = 1; // Select the number you want
setResult(exitCode);
finish();

3) И в родительской активности переопределите метод "onActivityResult":

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    int exitCode = 1;
    if(resultCode == exitCode) {
        super.setResult(exitCode); // use this if you have more than 2 activities
        finish();
    }
}

Это прекрасно работает для меня.

2 голосов
/ 11 августа 2011

Попробуйте следующее. У меня это работает.

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
ComponentName componentInfo = taskInfo.get(0).topActivity;
am.restartPackage(componentInfo.getPackageName());
2 голосов
/ 13 января 2011

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

2 голосов
/ 04 апреля 2011

Запустите второе действие с помощью startActivityForResult, а во втором возвращайте значение, которое один раз в методе onActivityResult первого действия закрывает основное приложение. Я думаю, что это правильный способ, которым Android делает это.

2 голосов
/ 08 октября 2014

Скажем, у вас есть стек активности, такой как A> B> C> D> E. Вы находитесь на занятии D и хотите закрыть свое приложение. Это то, что вы будете делать -

В Деятельности, с которой вы хотите закрыть (Активность D) -

Intent intent = new Intent(D.this,A.class);
intent.putExtra("exit", "exit");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

В вашей RootActivity (то есть в вашей основной деятельности, здесь Activity A) -

@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.hasExtra("exit")) {
            setIntent(intent);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (getIntent() != null) {
            if (("exit").equalsIgnoreCase(getIntent().getStringExtra(("exit")))) {
                onBackPressed();
            }
        }
    }

onNewIntent используется, потому что если активность активна, она получит первое намерение, которое ее начало. Не новый. Для более подробной информации - Документация

1 голос
/ 02 февраля 2014

Вот что я сделал, чтобы закрыть приложение: В моем приложении у меня есть базовый класс активности, я добавил статический флаг под названием applicationShutDown. Когда мне нужно закрыть приложение, я устанавливаю его в true.

В базовом действии onCreate и onResume после вызова супер-вызовов я проверяю этот флаг. Если «applicationShutDown» имеет значение true, я вызываю финиш для текущей операции.

Это сработало для меня:

protected void onResume() {
    super.onResume();
    if(BaseActivity.shutDownApp)
    {
        finish();
        return;

    }}
1 голос
/ 07 сентября 2011

Это на самом деле тихо, просто.

Я делаю это, сохраняя флаг в статической переменной, доступной для всех. Затем, когда я выхожу, я устанавливаю этот флаг, и все мои действия проверяют этот флаг onResume. Если флаг установлен, я выдаю System.exit для этого действия.

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

1 голос
/ 22 февраля 2012

Вы не правы. Есть один способ убить приложение. В классе с суперклассом Application мы используем какое-то поле, например, killApp. Когда мы запускаем заставку (первое действие) в onResume(), мы устанавливаем параметр в false для поля killApp. В каждом действии, которое мы имеем, когда в конце вызывается onResume(), мы называем что-то вроде этого:

if(AppClass.killApp())
    finish();

Каждое действие, которое попадает на экран, должно вызывать onResume(). Когда он вызывается, мы должны проверить, является ли наше поле killApp истинным. Если это правда, текущие действия вызывают finish(). Чтобы вызвать полное действие, мы используем следующую конструкцию. Например, в действии для кнопки:

AppClass.setkillApplication(true);
   finish();
   return;
0 голосов
/ 22 июня 2017

Я решил похожую проблему: MainActivity запускает BrowserActivity, и мне нужно закрыть приложение, когда пользователь нажимает Назад в BrowserActivity - чтобы не вернуться в MainActivity Итак, в MainActivity:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "sm500_Rmt.MainActivity";
    private boolean m_IsBrowserStarted = false;

и затем в OnResume:

    @Override
protected void onResume() {
    super.onResume();
    if(m_IsBrowserStarted) {
        Log.w(TAG, "onResume, but it's return from browser, just exit!");
        finish();
        return;
    }
    Log.w(TAG, "onResume");

... затем продолжайте OnResume. А при запуске BrowserActivity:

    Intent intent = new Intent(this, BrowserActivity.class);
    intent.putExtra(getString(R.string.IPAddr), ip);
    startActivity(intent);
    m_IsBrowserStarted = true;

И, похоже, работает хорошо! : -)

0 голосов
/ 21 июня 2012

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

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

Шаг 1. Поддержание статической переменной в mainacctivity. Скажем,

public static boolean isQuit = false;

Шаг 2. При событии нажатия кнопки установите для этой переменной значение true.

mainactivity.isQuit = true;
finish();

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

@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    if(mainactivity.isQuit)
        finish();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...