一、概念
当界面回退不了了,系统默认逻辑是最小化到后台,不会退出APP。
二、使用 BackHandler
根据UI操作逻辑,通过布尔值 enable 动态控制是否拦截系统返回逻辑用自己的(如回退自己的子界面而不是Activity或其它来响应)。也可以通过自定义一个计数器,来根据按返回键次数(两次)来决定是退出应用还是取消拦截默认最小化到后台。
| @Composable public fun BackHandler( enabled: Boolean = true, onBack: () -> Unit ) |
2.1 两次返回最小化APP(推荐)
var count by remember { mutableIntStateOf(0) }
var enable by remember { mutableStateOf(true) }
BackHandler(enable) {
count++
if (count == 1) {
"再按一次返回键回到桌面".showToast()
enable = false //取消监听
//通过协程延迟10秒后再次启用
scope.launch {
delay(10000)
count = 0
enable = true
}
}
}
2.2 两次返回退出APP
@Composable
private fun Demo(
) {
var count by remember { mutableIntStateOf(0) }
val context = LocalContext.current
BackHandler(true) {
count++
if (count == 1) {
"再按一次返回键退出应用".showToast()
}
if (count == 2) {
(context as? Activity)?.finish()
}
}
}
三、使用 OnBackPressedDispatcher
@Composable
private fun Demo(
) {
var count by remember { mutableIntStateOf(0) }
var enable by remember { mutableStateOf(true) }
val callback = remember(enable) {
object : OnBackPressedCallback(enable) {
override fun handleOnBackPressed() {
//回调逻辑同上方举例
}
}
}
val dispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
DisposableEffect(enable) {
dispatcher?.addCallback(callback)
onDispose { callback.remove() }
}
}
846

被折叠的 条评论
为什么被折叠?



