从Java演变到Kotlin下的jet pack

可以,这条演变线非常适合从 Java Android 经验迁移到 Compose。

1. 最早:多 Activity

早期很多 App 是:

```text

LoginActivity

HomeActivity

DetailActivity

SettingsActivity

```

跳转靠:

```java

startActivity(new Intent(...))

```

特点:

  • 每个页面都是一个 Activity

  • 生命周期清晰

  • 页面间传参靠 Intent extras

问题:

  • 页面多了 Activity 很散

  • 共享 UI 壳(底部导航、统一 Toolbar)麻烦

  • 返回栈、动画、状态管理比较分散


2. 后来:单 Activity + 多 Fragment

后来主流变成:

```text

MainActivity

-> FragmentContainerView

-> HomeFragment

-> DetailFragment

-> SettingsFragment

```

跳转靠:

```java

FragmentTransaction.replace(...)

addToBackStack(...)

```

或后来用 Jetpack Navigation:

```xml

navigation graph

```

特点:

  • Activity 做宿主

  • Fragment 表示页面

  • FragmentContainerView 承载页面

  • 可以共享 Toolbar、BottomNavigation

优点:

  • 页面模块化

  • 统一壳更容易

  • 返回栈比多 Activity 更集中

问题:

  • Fragment 生命周期复杂

  • View 生命周期和 Fragment 生命周期不是一回事

  • 容易内存泄漏、重复初始化

  • XML + ViewBinding + Adapter + Fragment 代码量大


现在像这个项目:

```text

MainActivity

-> setContent

-> NiaApp

-> Scaffold / NavigationSuiteScaffold

-> NavDisplay

-> ForYouScreen()

-> SearchScreen()

-> TopicScreen()

```

跳转靠:

```kotlin

navigator.navigate(SearchNavKey)

```

或标准 Compose Navigation 中:

```kotlin

navController.navigate("search")

```

特点:

  • Activity 仍然是宿主

  • 页面不再是 Fragment,而是 `@Composable Screen`

  • 返回栈是导航状态

  • UI 由 state 驱动重组

  • `NavDisplay` / `NavHost` 承载页面


三代对照

| 时代 | 页面单位 | 容器 | 跳转方式 | UI 更新 |

|---|---|---|---|---|

| 多 Activity | Activity | 系统 task stack | Intent | 手动改 View |

| Activity + Fragment | Fragment | FragmentContainerView | FragmentTransaction/NavController | 手动改 View/LiveData |

| Compose + Navigation | Composable Screen | NavHost/NavDisplay | NavKey/NavController | State -> Recompose |


最大变化是什么

旧时代:容器里装对象

以前你真的有:

```text

Activity 对象

Fragment 对象

View 对象

```

你会持有引用、找控件、调用方法。

Compose:状态决定显示什么

现在更多是:

```text

当前导航状态 = SearchNavKey

NavDisplay 根据 key 调用 SearchScreen()

```

你不再想着"替换一个 Fragment 对象",而是想着:

**导航状态变了,所以应该显示另一个 Composable。**


相同点

其实核心目的没变:

  • 都要有页面

  • 都要有返回栈

  • 都要传参数

  • 都要共享全局壳(Toolbar/BottomBar)

  • 都要处理生命周期


不同点

1. 页面形态变了

  • 以前:页面是 Activity/Fragment 类

  • 现在:页面是 Composable 函数

2. UI 更新方式变了

  • 以前:拿 View 引用改属性

  • 现在:状态变,Composable 重新执行

3. 导航方式变了

  • 以前:执行事务 replace/add

  • 现在:改变导航栈状态

4. 生命周期复杂度下降

  • 以前 Fragment 有 Fragment 生命周期 + View 生命周期

  • Compose 少了这层 View 生命周期,但多了 Composition/Recomposition 的概念


用当前项目类比

以前你可能写:

```text

MainActivity

-> FragmentContainerView

-> ForYouFragment

-> SearchFragment

```

现在这个项目是:

```text

MainActivity

-> setContent

-> NiaApp

-> NavDisplay

-> ForYouScreen

-> SearchScreen

```

所以 `NavDisplay` 在现代架构里的角色,基本就像以前的 `FragmentContainerView`,但它承载的是 **Composable 页面**。

一句话总结:

**Android 页面演变从"Activity 管页面"到"Fragment 管页面",再到"Navigation 状态驱动 Composable 页面"。**

相关推荐
帅次44 分钟前
Android 17 开发者实战:核心更新与应用场景落地指南
android·java·ios·android studio·iphone·android jetpack·webview
大鹏说大话1 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
搜狐技术产品小编20234 小时前
破局与重构:纯端侧 Android 自动化引擎的尝试与未来推演
android·运维·重构·自动化
码云骑士4 小时前
Android SystemServer启动过程
android·systemserver
weiggle5 小时前
第三篇:可组合函数(Composable)——Compose 的基石
android·前端
独隅6 小时前
Android Studio 接入多种不同 AI 大模型进行开发的全面详细指南(Android Studio+AI)
android·人工智能·android studio
夜微凉46 小时前
三、MySQL
android·数据库·mysql
我命由我123457 小时前
Android 开发问题:项目同时引入了两个包含相同类文件的库(AndroidX 库、旧版本支持库),导致了重复类错误
android·java·java-ee·android studio·android-studio·androidx·android runtime
anthonyzhu7 小时前
安卓Android studio panda run无法应用更新的问题
android·ide·android studio
jingling5558 小时前
Flutter | Dio网络请求实战
android·开发语言·前端·flutter