从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 页面"。**

相关推荐
逐光老顽童1 天前
Java 与 Kotlin 混合开发避坑指南:30 个真实案例实录
android·kotlin
爱勇宝2 天前
鸿蒙生态的下半场:开发者不只要能开发,还要能赚钱
android·前端·程序员
Yeyu2 天前
刷新一帧的艺术:invalidate / postInvalidate / postInvalidateOnAnimation全解析
android
潘潘潘2 天前
Android OTA 升级原理和流程介绍
android
plainGeekDev2 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
plainGeekDev2 天前
getter/setter → Kotlin 属性
android·java·kotlin
YXL1111YXL2 天前
Handler 消息回收与协程异步执行的时序陷阱
android
恋猫de小郭2 天前
KMP / CMP 鸿蒙版本 Beta 发布,他有什么特别之处?
android·前端·flutter
三少爷的鞋2 天前
Android 协程并发控制:别动线程池,控制好并发语义就够了
android
weiggle3 天前
第七篇:状态提升与单向数据流——架构设计的核心
android