Android 处理 Jetpack Compose 屏幕上的生命周期事件

问题描述 投票:0回答:3

在 Jetpack Compose 中,所有屏幕都是可组合功能。

Fragments
未在 Jetpack Compose 中使用。

我们如何使用 Jetpack Compose 处理生命周期事件?如果我们使用 Fragment,我们可以处理生命周期事件 (

onStart/onPause/onResume/onStop
)。这些对于释放资源、停止观察更改等不同场景很有用。

在 Jetpack Compose 中,如果我需要处理这些事件,我该如何在可组合屏幕中做到这一点?

请帮助我一些想法或资源,以便我能理解这一点。

提前致谢。

android android-jetpack-compose android-jetpack android-lifecycle
3个回答
16
投票

您可以获得LifecycleOwner

val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current

并使用

LifecycleEventObserver
注册
DisposableEffect
并在
DisposableEffect
的 onDispose 函数上删除此观察者。

如果您传递的函数在重组过程中可能会发生变化,您也可以使用 RememberUpdatedState。

我添加了一个示例

@Composable
private fun DisposableEffectWithLifeCycle(
    onResume: () -> Unit,
    onPause: () -> Unit,
) {

    val context = LocalContext.current

    // Safely update the current lambdas when a new one is provided
    val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current

    Toast.makeText(
        context,
        "DisposableEffectWithLifeCycle composition ENTER",
        Toast.LENGTH_SHORT
    ).show()

    val currentOnResume by rememberUpdatedState(onResume)
    val currentOnPause by rememberUpdatedState(onPause)

    // If `lifecycleOwner` changes, dispose and reset the effect
    DisposableEffect(lifecycleOwner) {
        // Create an observer that triggers our remembered callbacks
        // for lifecycle events
        val observer = LifecycleEventObserver { _, event ->
            when (event) {
                Lifecycle.Event.ON_CREATE -> {
                    Toast.makeText(
                        context,
                        "DisposableEffectWithLifeCycle ON_CREATE",
                        Toast.LENGTH_SHORT
                    ).show()
                }
                Lifecycle.Event.ON_START -> {
                    Toast.makeText(
                        context,
                        "DisposableEffectWithLifeCycle ON_START",
                        Toast.LENGTH_SHORT
                    ).show()
                }
                Lifecycle.Event.ON_RESUME -> {
                    currentOnResume()
                }
                Lifecycle.Event.ON_PAUSE -> {
                    currentOnPause()
                }
                Lifecycle.Event.ON_STOP -> {
                    Toast.makeText(
                        context,
                        "DisposableEffectWithLifeCycle ON_STOP",
                        Toast.LENGTH_SHORT
                    ).show()
                }
                Lifecycle.Event.ON_DESTROY -> {
                    Toast.makeText(
                        context,
                        "DisposableEffectWithLifeCycle ON_DESTROY",
                        Toast.LENGTH_SHORT
                    ).show()
                }
                else -> {}
            }
        }

        // Add the observer to the lifecycle
        lifecycleOwner.lifecycle.addObserver(observer)

        // When the effect leaves the Composition, remove the observer
        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)

            Toast.makeText(
                context,
                "DisposableEffectWithLifeCycle composition EXIT",
                Toast.LENGTH_SHORT
            )
                .show()
        }
    }

    Column(modifier = Modifier.background(Color(0xff03A9F4))) {
        Text(
            text = "Disposable Effect with lifecycle",
            color = Color.White,
            modifier = Modifier
                .padding(8.dp)
                .fillMaxWidth()
        )
    }
}

示范

val context = LocalContext.current

DisposableEffectWithLifeCycle(
    onResume = {
        Toast.makeText(
            context,
            "DisposableEffectWithLifeCycle onResume()",
            Toast.LENGTH_SHORT
        )
            .show()
    },
    onPause = {
        Toast.makeText(
            context,
            "DisposableEffectWithLifeCycle onPause()",
            Toast.LENGTH_SHORT
        )
            .show()
    }

)

4
投票

创建函数

@Composable
fun ComposableLifecycle(
    lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
    onEvent: (LifecycleOwner, Lifecycle.Event) -> Unit
) {

    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { source, event ->
            onEvent(source, event)
        }
        lifecycleOwner.lifecycle.addObserver(observer)

        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    }
}

在屏幕内调用此函数

 val TAG = "SecondScreen"
    ComposableLifecycle { _, event ->
        when (event) {
            Lifecycle.Event.ON_CREATE -> {
                Log.d(TAG, "onCreate")
            }
            Lifecycle.Event.ON_START -> {
                Log.d(TAG, "On Start")
            }
            Lifecycle.Event.ON_RESUME -> {
                Log.d(TAG, "On Resume")
            }
            Lifecycle.Event.ON_PAUSE -> {
                Log.d(TAG, "On Pause")
            }
            Lifecycle.Event.ON_STOP -> {
                Log.d(TAG, "On Stop")
            }
            Lifecycle.Event.ON_DESTROY -> {
                Log.d(TAG, "On Destroy")
            }
            else -> {}
        }
    }

来源 - Jetpack Compose 中的生命周期


0
投票

启动其他应用程序的 Activity 后无法触发。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.