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

相关推荐
flower_drop3 小时前
基于 WebUSB 与 CDP:在浏览器端实现 Android 设备通信与无证书抓包实践
android·chrome·测试工具·adb·bug·edge浏览器
撩得Android一次心动4 小时前
Jetpack Compose 知识点整理1【个人用】
android·学习·kotlin·android jetpack·compose
ForteScarlet6 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
方白羽7 小时前
Android Studio 自动国际化插件:SmartI18n
android·android studio·intellij idea
码农coding10 小时前
android12 状态栏图标的加载流程
android
hai_android11 小时前
Kotlin 协程作用域源码剖析
android·kotlin
Yeyu11 小时前
Android 画中画(PiP)小窗播放:怎么做、以及它到底是怎么工作的
android
千里马学框架11 小时前
安卓系统性能优化高级实战开发专题--开机,app冷启动优化
android·智能手机·性能优化·framework·性能·开机优化·app冷启动优化
律宏阔12 小时前
Android 手机通过 adblib 使用 ADB Wi-Fi 控制 Android 9 开发板
android
律宏阔12 小时前
Android App 里实现开机动画替换
android