当前位置: 首页 > 知识库问答 >
问题:

如何使用 Jetpack Compose and Compose Navigation 处理 Android 活动?

江烨伟
2023-03-14

我目前正在研究Jetpack Compose,试图使用现代Android架构组件构建一个功能丰富的应用程序。传统上,我的应用程序中的每个屏幕(或导航单元)要么是活动,要么是片段,每个都有自己的生命周期绑定,但对于Jetpack Compose和Compose导航库,我会这样做:

MainActivity.kt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val navController = rememberNavController()

            NavHost(navController = navController, startDestination = "main") {
                composable("main") { MainScreen(navController) }
                // More composable calls
            }
        }
    }
}

其中主屏幕只是一个可组合的。我的问题是:

  • 在这里,这种可组合的“生命周期”的等价物是什么?假设我想在加载屏幕、销毁屏幕等时执行一些操作。这可能与我有更多屏幕以及屏幕之间导航的情况更相关。
  • 是否有某种方式可以将合成和标准活动集成在一起?也就是说,按照您的意愿为屏幕定义活动,每个活动都是组件活动,并定义自己的可组合布局?这是否因为某种原因而受到阻碍

共有1个答案

梁丘远航
2023-03-14

撰写应用程序设计为在没有片段的单活动体系结构中使用。

您仍然可以拥有多个活动或片段,并在每个活动或片段中使用 setContent,但在这种情况下,活动之间的数据传输落在您的肩上。如果要将新的撰写屏幕添加到以旧方式构建的现有应用程序中,请使用此方法。

但是有了Compose,使用Compose Navigation在单个活动中完成所有导航就容易多了。更少的代码,更好的性能,因为没有不必要的代码层,易于传输数据等。

要处理视图生命周期,请查看撰写副作用:

  1. LaunchedEffects可用于在视图出现时执行操作。它还在绑定到当前可组合的协程上下文上运行:您可以轻松运行挂起函数,当视图从视图层次结构中消失时-协程将被取消。
  2. 可用于订阅/取消订阅回调。

当您旋转屏幕时,无论您通过哪个键,所有效果都将重新启动。

@Composable
fun MainScreen(navController: NavController) {
    LaunchedEffect(Unit) {
        println("LaunchedEffect: entered main")
        var i = 0
        // Just an example of coroutines usage
        // don't use this way to track screen disappearance
        // DisposableEffect is better for this
        try {
            while (true) {
                delay(1000)
                println("LaunchedEffect: ${i++} sec passed")
            }
        } catch (cancel: CancellationException) {
            println("LaunchedEffect: job cancelled")
        }
    }
    DisposableEffect(Unit) {
        println("DisposableEffect: entered main")
        onDispose {
            println("DisposableEffect: exited main")
        }
    }
}

还要注意,在这两种情况下,以及在compose中的许多其他情况下,都要将< code>key传递给这些函数。这有助于compose理解何时应该重新计算值。在我的例子中,它是< code>Unit,这意味着在视图消失之前它不会改变。但是,如果您创建了一个< code>remember值,使用视图模型中的另一个动态值,或者将另一个参数传递给composable,您可以将其作为< code>key传递,这将取消当前的< code>LaunchedEffect作业,并为< code>DisposableEffect调用< code>onDispose,并且您的作业将使用更新后的< code>key值重新启动。您可以传递任意多的键。

阅读有关在留档中撰写状态的更多信息。

 类似资料:
  • 使用quare https://github.com/Square/OkHttp的OkHttp,我如何: 检索从服务器返回的cookie 为即将到来的请求存储cookie 在后续请求中使用存储的cookie 更新后续请求返回的cookie 理想情况下,cookie将随每个请求自动存储、重新发送和更新。

  • 问题内容: 我正在连接到一个网站,正在登录。 该网站将我重定向到新页面,并且Mechanize处理所有cookie和重定向作业,但是,我找不到最后一页。我使用Firebug并再次完成了相同的工作,然后发现我必须通过Mechanize传递另外两页。 我快速浏览了一下页面,发现有一些JavaScript和HTML代码,但由于它看起来不像普通的页面代码而无法理解。这些页面是做什么用的?他们如何重定向到其

  • 我很难处理压缩文件,例如:

  • 我已经实现了Android推送通知,我可以在应用程序运行时使用此方法扩展来处理它: 但我真正需要的是在我当前的活动中获取通知数据,以更新一些字段,以便用户实时查看。但我找不到一个方法来做到这一点。有人能帮帮我吗?

  • 我有一个小,很少有活动,每个活动都有一个图像作为背景。 由于每个图像都相当大(全高清),它会快速消耗内存,从而使整个应用程序运行缓慢,甚至由于内存不足异常而崩溃。 你怎么处理这样的事情?