Как закрыть Android-приложение в Котлине

В JAVA мы можем закрыть приложение. Мы пытаемся развить навыки работы с Kotlin и чувствуем, что используем правильный синтаксис для закрытия приложения. Проблема в том, что код работает только в том случае, если вы закроете приложение перед переходом на вторую страницу и вернетесь к MainActivity, который является кодом активности запуска ниже.

    fun onTV(view: View){
    exitProcess()
}

private fun exitProcess() {
    //finish()
    System.exit(-1)
}

И finish, и System.exit (-1) работают, если сначала выбраны без навигации в PageTwoActivity

OnTV - это свойство onClick TextView. Я предполагаю, что нам нужно очистить флаги настройки покупки стека, поэтому вопрос каков синтаксис для этого в Котлине? Помните, что мы на странице запуска Основное занятие. Нужны ли нам намерения для достижения результатов?

Хорошо, я попробовал этот код без улучшений

    val intent = Intent(context, MainActivity::class.java)
    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOIntent.FLAG_ACTIVITY_NEW_TASK
    finish()

Мы близки, вот код в его нынешнем виде, проблема все еще в том, что, хотя это закроет приложение, если вы НЕ перейдете на PageTwo и не нажмете кнопку, чтобы закрыть приложение сразу после его запуска

    fun onTV(view: View){
    onBYE()
}

 fun onBYE() {
     exitProcess(-1)
 }

Итак, я предполагаю, что вопрос в том, как очистить PageTwo из стека при выполнении onBYE?

Да, startActivityForResult и setResult с некоторым EXIT_CODE и продолжаем слушать его и распространяться в обратном направлении (с большим количеством setResuts)

Marcos Vasconcelos 14.08.2018 01:29

@MarcosVasconcelos Поскольку я искал и не смог найти пример кода, не могли бы вы опубликовать небольшой фрагмент кода, именно эта строка меня смутила val intent = Intent (this @ MainActivity, PageTwoActivity :: class.java), объявляя намерение, в котором мы потеряны

Vector 14.08.2018 03:14

@MarcosVasconcelos Я добавил и отредактировал свой квест, чтобы показать структуру кода, который я использую для создания и намерения в Kotlin. НЕТ РЕЗУЛЬТАТОВ

Vector 14.08.2018 03:34
8
3
19 372
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

На этот счет есть два решения, работающих с вашим кодом:

val intent = Intent(context, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOIntent.FLAG_ACTIVITY_NEW_TASK
intent.putBooleanExtra(MainActivity.FINISH, true)
finish()

Объявите FINISH как val FINISH = "finish_key_extra"

И добавьте этот код в onCreate из MainActivity

super.onCreate(state)
boolean finish = getIntent().getBooleanExtra(FINISH, false) //default false if not set by argument
if (finish) {
    finish();
    return;
}

Поскольку вы используете CLEAR_TOP и NEW_TASK, у вас будет только одно действие в стеке, поэтому вы завершите его, отправив аргумент.

Другое решение, о котором я упоминал, - запускать каждое действие в вашем приложении с startActivityForResult(intent, REQUEST_CODE_X).

И для каждого действия в приложении также есть этот код: (объявите int FINISH_APP, который будет где-то использоваться в качестве кода результата)

void onActivityResult(int requestCode, int resultCode, Bundle result) {
     if (requestCode == AppIntents.REQUEST_CODE_X)
         if (resultCode == FINISH_APP){
             setResult(FINISH_APP);
             finish();
         }
}

И в любой момент вы захотите закрыть вызываемое приложение:

             setResult(FINISH_APP);
             finish();

Обратите внимание, что FINISH_APP объявлен отличным от RESULT_OK, RESULT_CANCELED, поэтому он все еще может использоваться вашим приложением.

Примечание: я разработчик Java, а не kotlin

Я ценю ваши предложения, они выглядят великолепно, попробовали оба, извините, что мы оба находимся в лодке разработки "не Kotlin", слишком много красного, когда я вставил код в простой проект, см. Комментарий к mducc для разработки приложения, если вы можете писать на Java мы всегда можем преобразовать. Все еще ищем код, чтобы просто закрыть приложение. Это не должно быть так сложно, но если бы это было не так, то где было бы весело?

Vector 14.08.2018 19:55

На самом деле, вам просто нужно перевести это

Marcos Vasconcelos 14.08.2018 20:19

@MarcosVasconcelow Я сделал перевод и все еще много КРАСНОГО Я добавил переменные, но не повезло, что вы узнаете, получу ли я результат

Vector 14.08.2018 20:30

Идея состоит в том, чтобы удалить стек и закончить единственный, который длится, вы можете просто создать новый FinishActivity и вызвать его с помощью CLEAR_TOP | NEW_TASK и единственное, что вы делаете onCreate, - это finish ()

Marcos Vasconcelos 14.08.2018 20:33
Ответ принят как подходящий

Грендель - два самых простых способа закрыть приложение Kotlin. первый способ откроет приложение на PageTwo, когда оно будет перезагружено не элегантно, но я включил на случай, если у кого-то есть заставка

     moveTaskToBack(true);
     exitProcess(-1)

Второй способ настолько прост и стар, что ты будешь кричать Приложение Kotlin закроется, и при перезагрузке сначала отобразится MainActivity.

finishAffinity()

Я тестировал это с помощью Nexus 9 API 26. У меня нет Samsung Galaxy S2. но не стесняйтесь писать мне один ха-ха

Это работает:

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

... но с важными оговорками, которые горячо обсуждаются в этом вопросе SO, Почему вызов Process.killProcess (Process.myPid ()) - плохая идея?

Другие вопросы по теме