Закрытие (или полный выход с уничтожением процесса) по кнопке

alertDialogBuilder.setPositiveButton("ДА"){_,_ ->
    //finish()
    //android.os.Process.killProcess(android.os.Process.myPid())
    //System.exit(1)
}

Как правильно выйти (закрыть, убить) из приложения? На метод finish() Android Studio ругается. На две другие строчки — нет, но понять вышло ли приложение или произошел crash с ошибкой не могу, так как в logcat ошибки нет:

демонстрация ошибки

MainActivity.kt:

class MainActivity : AppCompatActivity() { ..........

    override fun onStart() {
        super.onStart()

        val btnExit: Button = findViewById<Button>(R.id.btnExit) as Button
        btnExit.setOnClickListener {
            this.exitSid()
        }

MyFunctions.kt:

fun Context.exitSid() {
    val alertDialogBuilder = AlertDialog.Builder(this)

    alertDialogBuilder.setTitle("Выход из программы")
    alertDialogBuilder.setIcon(R.drawable.appicon)
    alertDialogBuilder.setMessage("Закрыть программу?")
    alertDialogBuilder.setCancelable(false)

    alertDialogBuilder.setPositiveButton("ДА"){_,_ ->
        Toast.makeText(this,"Программа закрыта",Toast.LENGTH_SHORT).show()
        //finishAndRemoveTask()
        //finishAffinity()
        //finish()
        //[email protected]
        android.os.Process.killProcess(android.os.Process.myPid())
        System.exit(1)

    }
}

Ответы (1 шт):

Автор решения: Vadik

Метод finish() есть у активити, но не у контекста.

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

Когда вы пишете finish() внутри вашей активити, то это эквивалентно:

this.finish()

Либо:

[email protected]()

Если вы хотите вызвать finish где-то еще, вне активности, то нужно передать объект activity, над которым вы хотите вызвать этот метод. Это не особенность Андроид или языка Котлин, а исходит просто из здравого смысла.

Так что если хотите, чтобы в вашей экстеншен-функции можно было вызвать finish, переделайте ее ресивер с Context на Activity:

fun Activity.exitSid() {
    finish()
}

Без экстеншен-функции это выглядело бы так:

fun exitSid(activity: Activity) {
    activity.finish()
}

А еще советую почитать основы, если вы не знали, что Activity это наследник Context.

→ Ссылка