Android退出APP拦截

import android.app.AlertDialog import android.os.Bundle import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import androidx.activity.viewModels import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber class MainActivity : AppCompatActivity() { private val viewModel: MainViewModel by viewModels() private val TAG = "MainActivity" private val backCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { handleAppExit() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) onBackPressedDispatcher.addCallback(this, backCallback) } private fun handleAppExit() { backCallback.isEnabled = false lifecycleScope.launch(Dispatchers.IO) { try { //判断是否需要提示 val isBeConfirm = true if (isBeConfirm) { withContext(Dispatchers.Main) { showExitConfirmationDialog() } } else { withContext(Dispatchers.Main) { finish() } } } catch (e: Exception) { Timber.tag(TAG).e(e) if (e !is CancellationException) { withContext(Dispatchers.Main) { finish() } } } finally { withContext(Dispatchers.Main) { backCallback.isEnabled = true } } } } private fun showExitConfirmationDialog() { AlertDialog.Builder(this) .setTitle("还不能退出") .setMessage("退出后,会如何?") .setPositiveButton("继续退出") { dialog, which -> finish() } .setNegativeButton("取消") { dialog, which -> dialog.dismiss() } .setCancelable(false) .show() } }

2025年11月28日